最近,我已经升级了我的ASMX Web服务,这些Web服务将两个操作公开了WCF,以与不同的消费者合作。通过此升级,WSDL SOAP动作从<namespace>/<operation>
更改为<namespace>/<service>/<operation>
。问题是,我仍然需要能够使用以前的消费者使用我的服务,而且他们只有我以前的WSDL定义。当他们发送请求时,他们会收到HTTP 500错误。
我尝试了什么:
- 强制我的操作合同方法对
Action="*"
做出响应,直到我对另一个操作做同样的操作。我了解到我无法使用多种操作合同方法来响应任何肥皂动作。 - 使用某种处理程序捕获
ProtocolException
,例如IHttpModule
或IErrorHandler
,并将请求重定向到所需的操作。我已经成功地注册了IHttpModule
课程,但我无法从任何EventHandler
中从我的请求中获得任何有效的信息。IErrorHandler
甚至无法正常工作。
有什么办法可以完成此操作?
我的服务课:
namespace sappi
{
[ServiceContract(Namespace = "sappi")]
[XmlSerializerFormat]
public interface IService
{
//[OperationContract]
[OperationContract(Action = "*", ReplyAction = "*")]
int put(Service.PutRequest putRequest);
[OperationContract]
int confirm(Service.ConfirmRequest confirmRequest);
}
我的IHttpModule
类:
namespace sappi
{
public class Handler : IHttpModule
{
public void Init(HttpApplication application)
{
application.BeginRequest += new EventHandler(beginRequest);
application.EndRequest += new EventHandler(endRequest);
}
private void beginRequest(Object source, EventArgs e)
{
//Log stuff...
}
private void endRequest(Object source, EventArgs e)
{
//Log stuff...
}
public void Dispose()
{
throw new NotImplementedException();
}
预先感谢您。
向后兼容从升级的Web服务从ASMX到WCF
尽管您可能可以将ASMX和SOAP服务融合到一个系统中,但这非常棘手,因为他们俩都会为HTTP所有权而战。
取而代之的是,您最好维护原始的ASMX服务并创建 new SOAP服务。
这允许两个端点:
- 您的原始ASMX HTTP端点
- 任何协议中的新肥皂端点。可以是http:8080;TCP;或管道(尽管可能不是互联网的后者)
普通业务逻辑
接下来,您需要重构原始服务,以便所有业务逻辑都在一个新的普通服务库中,您的ASMX和SOAP服务都可以使用。
完成后,两种服务中都应有最小的代码,同时允许通过ASMX端点向后兼容,并在SOAP端点中扩展。