从ASMX到WCF的升级Web服务的向后和向前兼容性

时间:2017-12-13 20:10:32

标签: c# web-services wcf soap wsdl

最近我升级了我的ASMX Web服务,它向WCF公开了两个操作,以便与不同的消费者一起工作。通过此升级,WSDL SOAP Action从<namespace>/<operation>更改为<namespace>/<service>/<operation>。问题是,我仍然需要能够让我以前的消费者使用我的服务,他们只有我以前的WSDL定义。当他们发送请求时,会收到HTTP 500错误。

我尝试了什么:

  1. 强制我的OperationContract方法响应Action="*",这一点工作正常,直到我对其他操作做了同样的操作。我已经知道我不能有多个OperationContract方法来响应任何soap动作。
  2. 使用某种处理程序来捕获ProtocolExceptionIHttpModule之类的IErrorHandler,并将请求重定向到所需的操作。我已成功注册我的IHttpModule课程,但我无法通过任何EventHandler的请求获得任何有效信息。 IErrorHandler甚至不起作用。
  3. 有什么方法可以实现这个目标吗?

    我的服务类:

    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();
            }
    

    提前谢谢。

1 个答案:

答案 0 :(得分:0)

  

从ASMX到WCF的升级Web服务的向后和向前兼容性

虽然您可能会将ASMX和SOAP服务融合到一个系统中,但它们会因为它们都会争夺HTTP所有权而相当棘手。

相反,您可能最好维护原始ASMX服务并创建 SOAP服务。

这允许两个端点:

  1. 您原来的ASMX HTTP端点
  2. 任何协议中的新SOAP端点。它可能是HTTP:8080; TCP;或管道(虽然可能不是互联网的后者)
  3. 通用业务逻辑

    接下来,您需要重构原始服务,以便所有业务逻辑都在一个新的公共服务无关库中,您的ASMX和SOAP服务都可以使用它。

    一旦完成,两个服务中的代码应该是最小的,同时允许通过ASMX端点向后兼容以及SOAP端点中的未来扩展。