WCF服务 - 向后兼容性问题

问题描述:

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

我已经设法让服务为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> 

有谁能提供意见吗?

好的,我们需要在短期内解决这个问题,所以我们想出了一个“互操作”或兼容层的概念。

我们所做的只是向该项目添加了传统的ASMX Web服务,并使用本机WCF调用从该服务调用WCF服务。然后,我们可以将适当的类型返回给客户端应用程序,而无需大量重新分解工作。我知道这是一个冒险的解决方案,但这是我们用这么大的遗留代码库的最佳选择。而且额外的好处是,它实际上效果出奇的好。 :)

啊,这是杀了我!大约3个月前,我在工作中做过这件事,现在我不记得所有的细节。我记得,但是,你需要basicHttpBinding,并且你不能使用新的序列化程序(这是默认的);但是,你需要使用basicHttpBinding,并且你不能使用新的序列化程序(这是默认的);我不记得,你必须使用“旧”XmlSerializer。

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

您必须使用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]进行修饰。

你的配置文件不需要改变。