2010-02-23 10 views
1

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?

Répondre

0

Il n'y a rien dans les WCF « de la boîte » pour supporter cette fonctionnalité - sauf peut-être:

  • exposer votre ancien contrat de service sur un point final
  • exposer le nouveau service sur une procédure distincte, nouveau point de terminaison (nouvelle adresse, nouveau port - peu importe)

Mais prendre cette décision là où se connecter doit être fait côté client. Vous pourriez éventuellement imaginer un service WCF "répartiteur" que vous pourriez demander où aller pour quel contrat - mais au moins ce point de terminaison et contrat du service WCF devrait rester fixe pour tout le temps.

Bien sûr, vous pouvez avoir plusieurs points de terminaison dans votre côté client app.config - et celles-ci peuvent être chargés en mémoire et inspecté:

ClientSection cs = ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection; 

if(cs != null) 
{ 
    foreach (ChannelEndpointElement ep in clientSection.Endpoints) 
    { 
     if(ep.Contract == 'IMyService') 
     { 
      Uri endpointAddress = e.Address; 
     } 
    } 
} 

Avec cela, vous pouvez créer une seule configuration côté client qui contient tous les points de terminaison, et vous pouvez trouver dynamiquement celui qui vous intéresse.

Questions connexes