2011-02-24 3 views
3

Je voudrais stocker les configurations de point de terminaison dans le fichier .config, mais être capable de modifier l'adresse de base au moment de l'exécution. EG: ce sont mes définitions en app.config point final:Récupère/modifie l'adresse du client Configuration du point de terminaison

<endpoint address="net.tcp://BASEURI:1001/FooService/" 
      binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Common" 
      contract="ServiceContracts.MyService" 
      name="FooService" /> 

<endpoint address="net.tcp://BASEURI:1002/BarService/" 
      binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Special" 
      contract="ServiceContracts.MyService" 
      name="BarService" /> 

Chaque service utilise le même marché (ServiceContracts.MyService), mais vivent sur un autre port, chemin différent, et parfois une configuration de liaison différente. Je veux être en mesure d'extraire par programme l'adresse "net.tcp: // BASEURI/FooService /", remplacer "BASEURI" par l'adresse du serveur, puis passer cela comme adresse à la DuplexChannelFactory lorsque le client la connexion est créée. EG:

string ServiceToUse = "FooService"; 

var endpointConfig = SomeFunctionThatGetsTheConfig(ServiceToUse); 
string trueAddress = endpointConfig.Address.Replace("BASEURI", "192.168.0.1"); 
DuplexChannelFactory<FooService> client = 
    new DuplexChannelFactory<FooService>(ServiceToUse, new EndpointAddress(trueAddress)); 

Je sais que les paramètres clients ne prennent pas en charge la <baseaddress> fonction des paramètres de service, mais mon but est de travailler autour de cette certaine façon pour que je n'ai pas savoir ce que le reste de l'URI ou la liaison est.

Remarque: Je n'utilise pas de classe Proxy, j'utilise directement la fonction DuplexChannelFactory.

Répondre

5

Vous pouvez le faire assez facilement sur votre ChannelFactory, par exemple:

ChannelFactory<IFoo> cf = new ChannelFactory<IFoo>("EndpointConfigName"); 
string address = cf.Endpoint.Address.Uri.ToString(); 
address = address.Replace("BASEURI", "192.168.0.1"); 
cf.Endpoint.Address = new EndpointAddress(address); 

Eh bien, vous avez DuplexChannelFactory, mais l'idée est la même .

+0

Parfait, travaillé la première fois. Merci beaucoup. Edit: WCF semble convertir la partie serveur ToLower, vous devez donc faire correspondre "baseuri" plutôt que "BASEURI". Sinon, cela fonctionne bien. –

0

Implémentez un IEndpointBehavior et changez l'URL lors de l'ajout.

Vous devez changer le ServiceEndpoint en ApplyClientBehavior:

void ApplyClientBehavior(
    ServiceEndpoint endpoint, 
    ClientRuntime clientRuntime 
) 
{ 
    endpoint.Address = ... 
} 
+0

Où puis-je implémenter IEndpointBehavior? Il n'y a pas de classe proxy utilisée, seulement le DuplexChannel. –

+0

Regardez l'exemple ici: http://msdn.microsoft.com/en-us/library/ms730137.aspx – Aliostad

+0

Bien que j'ai réussi à implémenter IEndpointBehavior et ma méthode ApplyCientBehavior est appelée lorsque le canal est créé, il est trop tard pour changer l'adresse du point de terminaison. Le changement ne prend pas effet. –

Questions connexes