我需要从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/
答案 0 :(得分:1)
过去我会从asmx中提取WSDL。然后我将使用参数/mc
对svcutil运行它,它生成服务和消息合同。然后我将重构代码以表现相同。在大多数情况下,它有效,但有一些问题。
根据您发布的代码,您希望将“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
}