WCF 服务 - 向后兼容性问题

Posted

技术标签:

【中文标题】WCF 服务 - 向后兼容性问题【英文标题】:WCF Service - Backward compatibility issue 【发布时间】:2010-09-05 13:45:09 【问题描述】:

我刚刚开始创建一些 WCF 服务,但我需要使它们向后兼容旧的(.NET 1.1 和 2.0)客户端应用程序。

我已经设法让服务为 3.0 和更高版本的客户端正确运行,但是当我使用 basicHttpBinding 端点(我认为这是我需要的兼容性所必需的)发布服务时,该服务会重构我的方法签名。例如

public bool MethodToReturnTrue(string seedValue);

在客户端应用程序中显示为

public void MethodToReturnTrue(string seedValue, out bool result, out bool MethodToReturnTrueResultSpecified);

我已经为我的自托管控制台应用程序尝试了 app.config 中我能想到的所有配置参数,但我似乎无法按预期实现此功能。我想这可能会导致我的期望存在缺陷,但令我惊讶的是 WCF 服务无法处理低级客户端的 bool 返回类型。

我当前的 app.config 如下所示。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="MyServiceTypeBehaviors" Name="MyCompany.Services.CentreService.CentreService">
        <clear />
        <endpoint address="http://localhost:8080/CSMEX"    binding="basicHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
        <endpoint address="http://localhost:8080/CentreService" binding="basicHttpBinding" bindingName="Compatible" name="basicEndpoint" contract="MyCompany.Services.CentreService.ICentreService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors" >
            <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

谁能给点建议?

【问题讨论】:

【参考方案1】:

啊,这可要了我的命!大约 3 个月前我在工作中这样做了,现在我不记得所有细节了。

不过,我确实记得,您需要 basicHttpBinding,而且您不能使用新的序列化程序(这是默认的);您必须使用“旧”XmlSerializer。

不幸的是,我不再在我做这个的地方工作,所以我不能去看代码。我会打电话给我的老板,看看我能挖出什么。

【讨论】:

【参考方案2】:

好的,我们需要在短期内解决这个问题,因此我们提出了“互操作”或兼容层的想法。

Bascally,我们所做的只是将传统的 ASMX Web 服务添加到项目中,并使用本机 WCF 调用从中调用 WCF 服务。然后,我们能够将适当的类型返回给客户端应用程序,而无需大量的重构工作。我知道这是一个 hacky 解决方案,但它是我们拥有如此庞大的遗留代码库的最佳选择。额外的好处是它实际上工作得非常好。 :)

【讨论】:

【参考方案3】:

您必须使用 XmlSerializer。例如:

[ServiceContract(Namespace="CentreServiceNamespace")]
[XmlSerializerFormat(Style=OperationFormatStyle.Document, SupportFaults=true, Use=OperationFormatUse.Literal)]
public interface ICentreService 
    [OperationContract(Action="CentreServiceNamespace/MethodToReturnTrue")]
    bool MethodToReturnTrue(string seedValue);

您必须手动设置操作动作名称,因为自动生成的 WCF 名称的构造与 ASMX 动作名称不同(WCF 也包括接口名称,ASMX 不包括)。

您使用的任何数据协定都应使用[XmlType] 而不是[DataContract] 进行修饰。

您的配置文件不需要更改。

【讨论】:

以上是关于WCF 服务 - 向后兼容性问题的主要内容,如果未能解决你的问题,请参考以下文章

WCF:单个服务的多个绑定配置

如何以向后兼容的方式向 DTO 添加属性?

WCF Web 服务错误:无法激活该服务,因为它不支持 ASP.NET 兼容性

具有向后兼容性的数据快照维护和开发

向后兼容在 MobileFirst 8.0 服务器中运行的 7.1 应用程序

MediaSession 和 MediaSessionManager 是不是具有向后兼容性?