在我们的生产环境中,我们的WCF服务使用XMLSerializer进行序列化。为此,我们的服务接口具有[XMLSerializerFormat]属性。现在,我们需要更改为DataContractSerializer,但我们必须保持与现有客户端的兼容性。因此,我们必须使用两个序列化器来公开每个服务。如何在同一主机上同时支持DataContractSerializer和XMLSerializer?
我们有一个约束:我们不想重新定义每个合同接口的两倍,我们有50个服务合同接口,我们不希望有
IIncidentServiceXml
IIncidentServiceDCS
IEmployeeServiceXml
IEmployeeServiceDCS
IContractServiceXml
IContractServiceDCS
我们怎样才能做到这一点?
更多信息
这是一个什么样我们迄今尝试了说明,但我愿意尝试完全不同的方法:
我们试图通过创建代码的所有端点在我们自己的ServiceHostFactory类中。基本上我们创建两个端点。问题是,在运行时,WCF抱怨服务有两个端点具有相同的联系人名称,但具有不同的ContractDescription实例。该消息表示我们应该使用不同的合约名称或重复使用相同的ContractDescription实例。
其他尝试:
我们也尝试通过使用不同的命名空间为每个ContractDescription实例来做到这一点。这样,我们将保持相同的合同接口(IIncidentService),但有两个不同的命名空间:
http://ourcompany/XML/IIncidentService
http://ourcompany/DCS/IIncidentService
有了,我们能够获得远,但服务有一个奇怪的异常崩溃:
An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is:
System.InvalidOperationException: An exception was thrown in a call to a WSDL export extension: System.ServiceModel.Description.XmlSerializerOperationBehavior
contract: http://ourcompany.cs/XML:IUserServiceWCF ----> System.NullReferenceException: Object reference not set to an instance of an object.
at System.ServiceModel.Description.XmlSerializerMessageContractExporter.ExportFaults(Object state)
at System.ServiceModel.Description.MessageContractExporter.ExportMessageContract()
at System.ServiceModel.Description.XmlSerializerOperationBehavior.System.ServiceModel.Description.IWsdlExportExtension.ExportContract(WsdlExporter exporter, WsdlContractConversionContext contractContext)
at System.ServiceModel.Description.WsdlExporter.CallExtension(WsdlContractConversionContext contractContext, IWsdlExportExtension extension)
我已经用另一次尝试更新了我的问题 – Sylvain 2010-06-11 20:22:16