如何在同一主机上同时支持DataContractSerializer和XMLSerializer?

Syl*_*ain 5 .net c# wcf xml-serialization datacontractserializer

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

我们有一个约束:我们不想重新定义每个合同接口两次,我们有50个服务合同接口,我们不希望有

IIncidentServiceXml 
IIncidentServiceDCS
IEmployeeServiceXml 
IEmployeeServiceDCS
IContractServiceXml 
IContractServiceDCS
Run Code Online (Sandbox Code Playgroud)

我们怎么做?


更多信息

这是对我们迄今为止所尝试的内容的描述,但我愿意尝试完全不同的方法:

我们尝试通过自己的ServiceHostFactory类中的代码创建所有端点.基本上我们创建两个端点两次.问题是在运行时,WCF抱怨该服务有两个具有相同联系人名称但具有不同ContractDescription实例的端点.消息说我们应该使用不同的合同名称或重用相同的ContractDescription实例.

其他尝试:

我们还尝试通过为每个ContractDescription实例使用不同的命名空间来实现.这样我们将保持相同的合同接口(IIncidentService),但有两个不同的命名空间:

http://ourcompany/XML/IIncidentService
http://ourcompany/DCS/IIncidentService
Run Code Online (Sandbox Code Playgroud)

有了这个,我们能够得到更远,但服务崩溃与一个奇怪的例外:

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)
Run Code Online (Sandbox Code Playgroud)

Ser*_*pth 1

简短的回答是,您不能,正是由于您的错误消息所说的原因,您不能拥有太多具有相同名称的端点,而您实际上正在尝试这样做。我认为你必须完全按照你所说的那样去做。

\n\n

这可能是您唯一的选择

\n\n
\n

问题是,指定服务就是使用 XmlSerializer,您需要在服务或协定上声明 [XmlSerializerFormat] 属性。好吧,因为\n我们想对两个端点使用相同的\n,所以我们可以\xe2\x80\x99t将它放在那里,所以\n我们只能将它放在\n合约上。但是,归根结底,两个端点都使用相同的服务和相同的合同,对吗?

\n\n

好吧,\xe2\x80\x99 不一定是这样。您可以让合同 A 从合同 B 派生,然后让服务实现合同 A,以便两个合同中的所有内容都是服务的一部分。对于此示例,合约 B 将是我们的标准合约,而合约 A 将是仅定义 [XmlSerializerFormat] 属性的接口。

\n
\n\n

但我不能向您保证无需更改即可使用您现有的客户代码。

\n