关于c#:WCF服务-向后兼容性问题

关于c#:WCF服务-向后兼容性问题

WCF Service - Backward compatibility issue

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

我设法使服务能够在3.0及更高版本的客户端上正确运行,但是当我使用basicHttpBinding端点发布该服务时(我认为这是实现兼容性所必需的),该服务将重构我的方法签名。 例如

1
public bool MethodToReturnTrue(string seedValue);

在客户端应用中显示为

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

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

我当前的app.config看起来像这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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>

有人可以建议吗?


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

Baiscally,我们所做的只是在项目中添加了传统的ASMX Web服务,并使用本机WCF调用从中调用了WCF服务。这样,我们就可以将适当的类型返回给客户端应用程序,而无需进行大量的重构工作。我知道这是一个骇人听闻的解决方案,但这是我们拥有如此庞大的旧版代码库的最佳选择。而且,额外的好处是它实际上运行良好。 :)


啊,这真杀了我!我大约3个月前在工作中做了此操作,现在我不记得所有细节了。

我确实记得,但是,您需要basicHttpBinding,并且不能使用新的序列化器(这是默认的)。您必须使用"旧的" XmlSerializer。

不幸的是,我不再在执行此操作的地方工作,因此无法查看代码。我会打电话给我的老板,看看有什么可以挖掘的。


您必须使用XmlSerializer。例如:

1
2
3
4
5
6
[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]

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


推荐阅读