Trong môi trường sản xuất của chúng tôi, các dịch vụ WCF của chúng tôi được tuần tự hóa với XMLSerializer. Để làm như vậy, các giao diện dịch vụ của chúng ta có thuộc tính [XMLSerializerFormat]. Bây giờ, chúng ta cần phải thay đổi thành DataContractSerializer nhưng chúng ta phải tương thích với các máy khách hiện tại của chúng ta. Vì vậy, chúng ta phải trưng ra từng dịch vụ với cả hai serializers.Làm thế nào để hỗ trợ cả DataContractSerializer và XMLSerializer cho cùng một hợp đồng trên cùng một máy chủ?
Chúng tôi có một hạn chế: chúng tôi không muốn để xác định lại mỗi giao diện hợp đồng hai lần, chúng tôi có giao diện hợp đồng 50 dịch vụ và chúng tôi không muốn có
IIncidentServiceXml
IIncidentServiceDCS
IEmployeeServiceXml
IEmployeeServiceDCS
IContractServiceXml
IContractServiceDCS
Làm thế nào chúng ta có thể làm điều đó?
thông tin
Đây là một mô tả về những gì chúng tôi đã cố gắng cho đến nay nhưng tôi sẵn sàng thử các cách tiếp cận hoàn toàn khác nhau thêm:
Chúng tôi đã cố gắng để tạo ra tất cả các thiết bị đầu cuối theo mã trong lớp ServiceHostFactory của chúng ta. Về cơ bản chúng tôi tạo ra mỗi điểm cuối hai lần. Vấn đề là ở thời gian chạy, WCF phàn nàn rằng dịch vụ có hai điểm cuối với cùng một tên liên lạc nhưng với các cá thể ContractDescription khác nhau. Thông báo cho biết chúng ta nên sử dụng các tên hợp đồng khác nhau hoặc sử dụng lại cùng một cá thể ContractDescription.
Các nỗ lực khác:
Chúng tôi cũng đã cố gắng thực hiện việc này bằng cách sử dụng các không gian tên khác nhau cho mỗi phiên bản ContractDescription. Bằng cách đó, chúng tôi sẽ giữ giao diện hợp đồng tương tự (IIncidentService) nhưng với hai không gian tên khác nhau:
http://ourcompany/XML/IIncidentService
http://ourcompany/DCS/IIncidentService
Với điều đó, chúng tôi đã có thể để có được xa hơn nhưng dịch vụ đâm với một ngoại lệ kỳ lạ:
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)
Tôi đã cập nhật câu hỏi của mình ở trên với một nỗ lực khác – Sylvain