En nuestro entorno de producción, nuestros servicios WCF se serializan con XMLSerializer. Para hacerlo, nuestras interfaces de servicio tienen el atributo [XMLSerializerFormat]. Ahora, tenemos que cambiar a DataContractSerializer pero debemos ser compatibles con nuestros clientes existentes. Por lo tanto, tenemos que exponer cada servicio con ambos serializadores.¿Cómo admitir DataContractSerializer y XMLSerializer para el mismo contrato en el mismo host?
Tenemos una restricción: no queremos volver a definir cada interfaz contrato de dos veces, tenemos interfaces de contrato 50 servicios y no quieren tener
IIncidentServiceXml
IIncidentServiceDCS
IEmployeeServiceXml
IEmployeeServiceDCS
IContractServiceXml
IContractServiceDCS
¿Cómo podemos hacer eso?
Más información
Ésta es una descripción de lo que hemos tratado hasta ahora, pero estoy dispuesto a probar enfoques completamente diferentes:
Tratamos de crear todos los puntos finales por código en nuestra propia clase ServiceHostFactory. Básicamente creamos cada punto final dos veces. El problema es que en el tiempo de ejecución, WCF se queja de que el servicio tiene dos puntos finales con el mismo nombre de contacto pero con diferentes instancias de ContractDescription. El mensaje dice que debemos usar diferentes nombres de contrato o reutilizar la misma instancia de ContractDescription.
Otro intento:
También trató de hacerlo mediante el uso de diferentes espacios de nombres para cada instancia ContractDescription. De esa manera mantendríamos la misma interfaz de contrato (IIncidentService) pero con dos espacios de nombres diferentes:
http://ourcompany/XML/IIncidentService
http://ourcompany/DCS/IIncidentService
Con esto hemos sido capaces de llegar más lejos, pero el servicio caído con una excepción rara:
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)
he actualizado mi pregunta anterior con otro intento – Sylvain