L'ancienne version de la WCF livrait selon l'ancienne version de l'interfacedécouverte du contrat dans WCF après contrat de service Inheritence
<endpoint name="ServiceName" address="http://production.server/Service.svc"
binding="basicHttpBinding" bindingConfiguration="myBasicHttpBinding"
contract="myAPI.IOriginalService" />
avec la nouvelle version délivrant
<endpoint name="ServiceName" address="http://development.server/Service.svc"
binding="basicHttpBinding" bindingConfiguration="myBasicHttpBinding"
contract="myAPI.IDerivedService" />
Cela fonctionne très bien. Les anciens clients peuvent se connecter à l'un ou l'autre des serveurs en demandant IOriginalService
et les nouveaux clients peuvent demander IDerivedService
... mais ils ne peuvent demander au serveur de développement que s'ils en demandent au serveur de production, une erreur est levée. Tout va bien.
Je préférerais que de nouveaux clients essaient d'être un peu malin, et utilisent le nouveau format quand ils le peuvent, mais utilisent l'ancien si ce n'est pas disponible. Je pourrais juste attraper l'exception, mais c'est cher et je préférerais faire un test, plutôt que d'attraper un résultat probable. Je souhaite donc me connecter au point de terminaison et lui demander la valeur du contrat, puis utiliser la valeur de retour pour décider quel type demander, par ex.
var endPoint = someMethod("ServiceName");
var contractName = endPoint.WhatContractDoYouOffer();
if(contractName == "IOriginalService")
CallAMethod<IOriginalService>(parameters);
else
CallAMethod<IDerivedService>(newParameters);
Est-ce faisable?