使用SOAP Header和Mtom,WSE-3从ASP.NET Web服务迁移到WCF

时间:2013-10-07 05:46:56

标签: wcf web-services

我需要从ASP.NET Web服务迁移到WCF。目前的代码是这样的:

服务器端:

    public class MyType
    {
    public int x;
    public string s;
    }

    public class MyService : WebService
    {
    public MyType myObj;

    [WebMethod]
    [SoapHeader("myObj", Direction=SoapHeaderDirection.InOut)]
    public string SomeMethod() // NO Parameter!!!
    {
            if (myObj.x > 5)
               return myObj.s;
            else
               return "Less than 5";    
        }
    }
</code>

客户端:

    MyService service = new MyService();
    MyType m = new MyType();
    m.x = 10;
    m.s = "That's it!!!";
    service.myObj = m;
    string s = service.SomeMethod();

这很顺利。现在我需要将其更改为WCF。发现了许多关于如何使用WCF签署soap标头的主题,但所有主题都是关于如何使用MessageContract作为类的属性,该类将作为参数提供给操作。像这样:

<code>
    [MessageContract]
    public class MyType
    {
       public int x;
       public string s;
    }

    [OperationContract]
    public string SomeMethod(MyType myType)
    {

    } </code>

但这不是我需要的,我的方法必须保持不变(没有参数)。

很少有博客讨论使用WCFExtra lib或实现Client Dispatcher接口来为每个传出请求添加SOAP Header。但同样,我希望将Web服务迁移到WCF不应该影响我的客户端,并且他们不需要进行任何代码更改,他们应该能够使用扩展名为.asmx的Web服务。此外,当前的Web服务使用MTOM和WSE-3。有没有简单的方法。

请帮助我。

我已经阅读了以下文章,但没有人谈论如何处理SOAP Header,WSE-3:

http://megakemp.com/2008/11/27/migrating-aspnet-web-services-to-wcf/
http://megakemp.com/2008/11/27/migrating-aspnet-web-services-to-wcf/
http://vikasbhardwaj15.blogspot.in/2012/05/convert-asmx-web-services-to-wcf.html
http://blogs.msdn.com/b/trobbins/archive/2006/12/02/integrating-wcf-with-your-existing-asmx-services.aspx
http://blogs.msdn.com/b/kaevans/archive/2006/10/05/phased-migration-from-asmx-to-wcf.aspx
http://www.manas.com.ar/waj/2007/05/31/asmx-to-wcf-migration/

1 个答案:

答案 0 :(得分:1)

过去我会从asmx中提取WSDL。然后我将使用参数/mcsvcutil运行它,它生成服务和消息合同。然后我将重构代码以表现相同。在大多数情况下,它有效,但有一些问题。

根据您发布的代码,您希望将“myObj”封装为请求和响应消息中的标头,类似于以下内容:

[DataContract]
public class MyType
{
    [DataMember]
    public int x;

    [DataMember]
    public string s;
}

[MessageContract]
public class SomeMethodRequestMessage
{
    [MessageHeader] public MyType myObj;
}

[MessageContract]
public class SomeMethodResponseMessage
{
    [MessageHeader] public MyType myObj;
    [MessageBodyMember] public string result;
}

// Inside your service contract

[OperationContract]
public SomeMethodResponseMessage SomeMethod(SomeMethodRequestMessage message)
{
   // do stuff
}

Using Message Contracts