【发布时间】:2011-03-02 19:56:34
【问题描述】:
在我们的生产环境中,我们的 WCF 服务使用 XMLSerializer 进行序列化。为此,我们的服务接口具有 [XMLSerializerFormat] 属性。现在,我们需要更改为 DataContractSerializer,但我们必须与现有客户端保持兼容。因此,我们必须使用两个序列化器公开每个服务。
我们有一个约束:我们不想重新定义每个合约接口两次,我们有 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)
【问题讨论】:
标签: c# .net wcf xml-serialization datacontractserializer