Question

Donc, j'ai un service WCF qui écoute à la fois sur 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 un canal nommé. Je ne veux pas la configuration dans app.config, mais dans le code.

Le client WCF obtiendra l'adresse du point de terminaison lors de l'exécution. Par conséquent, quelque chose comme & "net.tcp: // mymachine: 10001 / MyService &"; ou " net.pipe: // localhost / MyService " ;. Je penserais qu'il utiliserait simplement le bon NetTcpBinding ou NetNamedPipeBinding basé sur le schéma Uri - mais cela ne ressemble pas à ça.

Je ne peux pas simplement configurer le proxy pour qu'il prenne des liaisons nommées pipe ou tcp, et il choisira celle en fonction de l'adresse du noeud final?

EDIT: OK, je renifle le schéma et remplis 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 j'obtiens un échec de connexion - & "L'objet de communication System.ServiceModel.Channels.ServiceChannel ne peut pas être utilisé pour la communication car il est à l'état Faulted. &";

Si vous modifiez la liaison à un BindingElement et utilisez NamedPipeTransportBindingElement, TcpTransportBindingElement, etc. avec un CustomBinding, cela fonctionne ... mais je ne suis pas sûr de comprendre la différence.

Était-ce utile?

La solution

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

Vous devrez examiner le schéma, puis, sur cette base, choisir la liaison correcte. C’est assez simple à faire, en utilisant la classe Uri, qui effectuera l’analyse pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top