在生产环境中,我们的WCF服务已使用XMLSerializer进行了序列化。为此,我们的服务接口(interface)具有[XMLSerializerFormat]属性。现在,我们需要更改为DataContractSerializer,但必须与现有客户保持兼容。因此,我们必须使用两个序列化器公开每个服务。

我们有一个约束:我们不想将每个契约(Contract)接口(interface)重新定义两次,我们有50个服务契约(Contract)接口(interface),我们也不想拥有

IIncidentServiceXml
IIncidentServiceDCS
IEmployeeServiceXml
IEmployeeServiceDCS
IContractServiceXml
IContractServiceDCS

我们该怎么做?

更多信息

这是到目前为止我们已经尝试过的描述,但是我愿意尝试完全不同的方法:

我们尝试通过我们自己的ServiceHostFactory类中的代码创建所有终结点。基本上,我们每个端点创建两次。问题在于,在运行时,WCF提示该服务有两个终结点,这些终结点的联系人姓名相同,但ContractDescription实例不同。该消息说我们应该使用不同的契约(Contract)名称或重用相同的ContractDescription实例。

其他尝试:

我们还尝试通过对每个ContractDescription实例使用不同的命名空间来做到这一点。这样,我们将保留相同的协定接口(interface)(IIncidentService),但具有两个不同的 namespace :
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)

最佳答案

简短的答案是,由于错误消息所说的原因,您不能这样做,您不能有太多试图有效地使用相同名称的端点。我认为您将必须完全按照您说的去做。

This might be your only option



但是我不能保证您可以不更改而使用您现有的客户代码。

关于c# - 如何为同一主机上的同一契约(Contract)同时支持DataContractSerializer和XMLSerializer?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3025762/

10-12 12:45