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.
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. –