【问题标题】:Migration from ASP.NET web service with SOAP Header and Mtom, WSE-3 to WCF从带有 SOAP Header 和 Mtom、WSE-3 的 ASP.NET Web 服务迁移到 WCF
【发布时间】:2013-10-07 05:46:55
【问题描述】:

我需要从 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 签署肥皂头的主题,但所有主题都是关于如何使用 MessageContract 作为类的属性,该属性将作为参数提供给操作。像这样:

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

    [OperationContract]
    public string SomeMethod(MyType myType)
    {

    } </code>

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

很少有博客谈论使用 WCFExtra 库或实现 Client Dispatcher 接口以将 SOAP 标头添加到每个传出请求。但同样,我希望将 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/

【问题讨论】:

    标签: wcf web-services


    【解决方案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

    【讨论】:

    • 维尔纳,感谢您的回复。是的,我也已经尝试过,使用传递给 svcutil.exe 的 WSDL 文件生成代码但问题是,它改变了方法签名。我希望方法签名相同。如果我的使用 SOAP Header 的 Web 方法具有像 public void Add(String atr1, String str2) 这样的签名,那么即使从 Web 服务迁移到 WCF 后它也应该保持不变
    • 我所知道的使用强类型标头(又名 MyType)的唯一方法是将其作为消息协定传递给方法主体。为什么不想更改操作签名操作?对于完全相同的 SOAP 消息,它有两种不同的实现。
    • 这就是问题所在,我无法更改操作合同签名。更改签名意味着,影响所有正在使用 Web 服务的客户端。
    • 并非总是如此。相同的物理肥皂请求/响应可以在代码中以许多不同的方式表示。尽管关于名称空间和类型名称,您确实必须小心。看起来您可能将消息合同与数据合同混淆了。
    • 感谢您的回复。但我需要 OperationContract(Webmethod)签名相同。无论如何,我会尝试您提出的解决方案并通知您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多