2009-01-28 7 views
1

J'ai donc un service WCF qui écoute à la fois net.tcp et net.pipe. J'ai généré un client proxy WCF, et j'aimerais qu'il puisse se connecter via tcp ou named pipe. Je ne veux pas la config dans app.config, mais dans le code.Liaisons WCF

Le client WCF obtiendra l'adresse de point de terminaison à l'exécution, donc quelque chose comme "net.tcp: // mymachine: 10001/MyService" ou "net.pipe: // localhost/MyService". Je pense qu'il utiliserait juste le bon NetTcpBinding ou NetNamedPipeBinding basé sur le schéma d'Uri - mais il ne regarde pas de cette façon. Je ne peux pas simplement configurer le proxy pour prendre des liaisons pipe ou tcp nommées, et il choisira celui basé sur l'adresse de point de terminaison?

EDIT: D'accord, donc je renifle le schéma et alimenter la liaison:

var uri = new Uri("net.tcp://localhost:10001/MyService"); 
Binding b; 
if (uri.Scheme == Uri.UriSchemeNetPipe) { 
    b = new NetNamedPipeBinding(); 
} else if (uri.Scheme == Uri.UriSchemeNetTcp) { 
    b = new NetTcpBinding(); 
} else if (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps) { 
    b = new WSHttpBinding(); 
} 

var proxy = new ClientProxy(b, new EndpointAddress(uri)); 

mais je reçois un échec de connexion - « L'objet de communication, System.ServiceModel.Channels.ServiceChannel, ne peut pas être utilisé pour communication car elle est en état Faulted. " Si vous modifiez la liaison à un objet BindingElement et utilisez NamedPipeTransportBindingElement, TcpTransportBindingElement, etc. avec un CustomBinding, cela fonctionne ... mais je ne suis pas sûr de comprendre la différence.

+0

Une brève discussion sur le sujet [Présentation des liaisons WCF et de la chaîne de canaux] (http://wcfanswers.blogspot.com/2012/06/understanding-wcf-bindings-and-channel.html). Parcourez ceci pour comprendre quelle liaison doit être utilisée pour quel scénario. –

Répondre

3

Non, vous ne pouvez pas. Il ne peut y avoir qu'un seul élément de transport dans la liaison, en avoir plus d'un n'a tout simplement aucun sens.

Vous devrez examiner le schéma, puis en fonction de cela, choisissez la liaison correcte. C'est assez simple à faire, en utilisant la classe Uri, qui effectuera l'analyse pour vous.

+0

Je l'ai eu en travaillant avec * TransportBindingElements et une liaison personnalisée, mais je suis confus quant à ce que la différence entre cela et les liaisons sont .... –