在我們的生產環境中,我們的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