Dans notre environnement de production, nos services WCF sont sérialisés avec XMLSerializer. Pour ce faire, nos interfaces de service ont l'attribut [XMLSerializerFormat]. Maintenant, nous devons passer à DataContractSerializer mais nous devons rester compatibles avec nos clients existants. Par conséquent, nous devons exposer chaque service avec les deux sérialiseurs.Comment prendre en charge à la fois DataContractSerializer et XMLSerializer pour le même contrat sur le même hôte?
Nous avons une contrainte: nous ne voulons pas redéfinir chaque interface de contrat deux fois, nous avons des interfaces contrat de 50 services et nous ne voulons pas avoir
IIncidentServiceXml
IIncidentServiceDCS
IEmployeeServiceXml
IEmployeeServiceDCS
IContractServiceXml
IContractServiceDCS
Comment pouvons-nous faire cela?
Plus d'info
Voici une description de ce que nous avons essayé jusqu'à présent, mais je suis prêt à essayer des approches complètement différentes:
Nous avons essayé de créer tous les critères d'évaluation par code dans notre propre classe ServiceHostFactory. Fondamentalement, nous créons deux points de terminaison deux fois. Le problème est qu'à l'exécution, WCF se plaint que le service a deux points de terminaison avec le même nom de contact mais avec différentes instances de ContractDescription. Le message indique que nous devrions utiliser différents noms de contrat ou réutiliser la même instance de ContractDescription.
Autre tentative:
Nous avons aussi essayé de le faire en utilisant différents espaces de noms pour chaque instance ContractDescription. De cette façon, nous garderons la même interface contrat (IIncidentService) mais avec deux espaces de noms différents:
http://ourcompany/XML/IIncidentService
http://ourcompany/DCS/IIncidentService
Avec que nous avons pu obtenir plus, mais le service est écrasé à une exception bizarre:
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)
J'ai mis à jour ma question ci-dessus avec une autre tentative – Sylvain