2012-03-01 8 views
17

Tengo ambos extremos de un Stream bidireccional conectado, sobre el que deseo hacer alguna comunicación. La implementación subyacente detrás de la transmisión no es importante, quiero trabajar en el nivel Stream ...Uso de WCF para envolver un flujo conectado existente

En lugar de implementar mi propio protocolo de comunicaciones para la transmisión, quiero utilizar todas las bondades WCF existentes para ajustar el transmisión existente con un canal de comunicaciones WCF bidireccional (solicitud/respuesta + devolución de llamada).

Mi pregunta es, ¿cómo puedo hacer esto ...?

ACTUALIZACIÓN:

me he ido por el camino de la implementación de un transporte personalizado. Tengo este trabajo, pero todavía no estoy totalmente feliz con ella ...

he implementado un IDuplexSessionChannel para envolver la corriente, junto con la adecuada IChannelFactory y IChannelListener, y un elemento de unión para crear el canal suerte. Ahora, simplemente paso a través de la transmisión conectada, y eventualmente los paso al canal de transporte cuando es creado.

lo tanto, puedo crear el proxy de cliente para acceder al servicio a través de la corriente de la siguiente manera:

var callback = new MyCallback(); 
var instanceContext = new InstanceContext(callback); 
var pipeFactory = new DuplexChannelFactory<IMyService>(instanceContext, new StreamBinding(clientStream), 
                 new EndpointAddress("stream://localhost/MyService")); 
var serviceProxy = pipeFactory.CreateChannel(); 

El problema que tengo es, parece WCF se encuentra en el uso de un ServiceHost para crear el extremo del servidor de el canal, a través de IChannelListener. En mi caso, ya tengo una transmisión conectada, y no podré escuchar más conexiones entrantes. Puedo evitar esto, pero preferiría no utilizar un ServiceHost para crear el servidor al final del canal, porque termino con un montón de repeticiones y hackeos poco claros para hacerlo funcionar.

Preguntas

estoy buscando, por lo tanto, para una mejor manera de tomar las IDuplexSessionChannels, y envolver estos en un proxy de canal tanto en el servidor y el cliente termina.

O tal vez una implementación de ServiceHost diferente que no requiere un IChannelListener.

Realmente, el problema aquí es que no quiero un solo servidor, la disposición de múltiples clientes, tengo una relación 1-1 entre mi Servicio WCF y el cliente. ¿Hay una forma correcta de instanciar uno de estos?

Para decirlo de otra manera, quiero crear la instancia de servicio del lado del servidor sin utilizar un ServiceHost.

Cualquier sugerencia sería apreciada en esta etapa.

+0

Parece que puede confundir la función de un host de servicio WCF y una instancia de servicio WCF. Un host de servicio WCF proporciona instancias de un servicio basado en el InstanceContextMode. Esta [publicación de blog] (http://www.danrigsby.com/blog/index.php/2008/05/23/understanding-instancecontext-in-wcf/) tiene una buena explicación de cómo funciona.Realmente no puede tener una instancia de un servicio WCF sin un ServiceHost que lo proporcione. ServiceHost, a su vez, depende de un ChannelListener para administrar la infraestructura de mensajería para él. Sin él, tendrías un ServiceHost "sordo" :) –

+0

Entonces, lo que intento hacer es hacer las cosas que 'ServiceHost' hace para crear una instancia' InstanceContext' y Service. 'ServiceHost' debe hacer esto cuando acepta una nueva conexión entrante. Ya tengo la conexión establecida, por lo que quiero omitir la parte de escucha. Seguramente esto no es * imposible * ...? – Mark

+0

@Mark Para mí, esto equivale a tomar un túnel existente y construir otro túnel para contenerlo ... WCF no fue construido para este tipo de cosas ... cuál es exactamente el problema con la transmisión existente (que usted escribe está funcionando) ¿Crees que usar WCF resolverá? – Yahia

Respuesta

0

Use un cliente en ambos extremos. Sin embargo, deberá definir sus contratos cuidadosamente. Si tiene ClientA y ClientB en cualquier extremo de la secuencia, cuando ClientA envía una solicitud, ClientB esperará que se vea como lo que ve, ya que es un contrato de devolución de llamada definido y viceversa.

Cuestiones relacionadas