Pregunta

Entonces, tengo un servicio WCF que está escuchando tanto en net.tcp como en net.pipe. He generado un cliente proxy WCF y me gustaría poder conectarse a través de tcp o canalización con nombre. No quiero la configuración en app.config, sino en código.

El cliente WCF obtendrá la dirección del punto final en tiempo de ejecución, así que algo como " net.tcp: // mymachine: 10001 / MyService " o " net.pipe: // localhost / MyService " ;. Creo que solo usaría el NetTcpBinding correcto o NetNamedPipeBinding basado en el esquema Uri, pero no se ve de esa manera.

¿No puedo configurar el proxy para que tome enlaces con nombre de tubería o tcp, y elegirá el que se base en la dirección del punto final?

EDITAR: Ok, entonces huelo el esquema y puebla el enlace:

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));

pero obtengo un error de conexión: " El objeto de comunicación, System.ServiceModel.Channels.ServiceChannel, no se puede utilizar para la comunicación porque está en estado Faulted. "

Si cambia Binding a BindingElement y usa NamedPipeTransportBindingElement, TcpTransportBindingElement, etc. con CustomBinding funciona ... pero no estoy seguro de entender cuál es la diferencia.

¿Fue útil?

Solución

No, no puedes. Solo puede haber un elemento de transporte en el enlace, tener más de uno simplemente no tiene sentido.

Tendrá que mirar el esquema y luego, basándose en eso, elegir el enlace correcto. Es bastante simple de hacer, usando la clase Uri, que realizará el análisis por usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top