В нашей производственной среде наши сервисы 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)