我需要做从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库或实现客户端调度程序接口来向每个传出请求添加SOAP头。但同样,我希望web服务迁移到WCF不会影响我的客户端,并且他们不需要做任何代码更改,他们应该能够使用.asmx扩展的web服务。此外,当前的web服务使用MTOM和WSE-3。有没有什么简单的方法。
请帮我弄一下这个。
我已经阅读了以下文章,但没有一篇文章讨论如何处理SOAP头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/发布于 2013-10-07 15:03:55
在过去,我会从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
}参见Using Message Contracts。
https://stackoverflow.com/questions/19217848
复制相似问题