提问人:ZombieSheep 提问时间:8/8/2008 最后编辑:John SaundersZombieSheep 更新时间:12/14/2011 访问量:2808
WCF 服务 - 向后兼容性问题
WCF Service - Backward compatibility issue
问:
我刚刚开始创建一些 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 服务无法处理下层客户端的布尔值返回类型。
我当前的 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>
谁能建议,请问?
答:
啊,这是要杀了我!大约 3 个月前我在工作中这样做了,现在我不记得所有细节了。
但是,我确实记得您需要 basicHttpBinding,并且您不能使用新的序列化程序(这是默认值);您必须使用“旧”XmlSerializer。
不幸的是,我不再在我做这件事的地方工作了,所以我不能去看代码。我会打电话给我的老板,看看我能挖到什么。
好吧,我们需要在短期内解决这个问题,所以我们想出了一个“互操作”或兼容层的想法。
我们所做的只是将传统的 ASMX Web 服务添加到项目中,并使用本机 WCF 调用从中调用 WCF 服务。然后,我们能够将适当的类型返回给客户端应用程序,而无需进行大量的重构工作。我知道这是一个骇人听闻的解决方案,但对于如此庞大的遗留代码库,这是我们最好的选择。额外的好处是它实际上效果出奇的好。:)
您必须使用 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]
您的配置文件应该不需要更改。
评论