2011-03-16 7 views
9

Estoy tratando de ejecutar múltiples aplicaciones de alojamiento WCF Service en la misma máquina.WCF Multiple Apps using NetNamedPipe

Quiero ejecutar múltiples Aplicaciones - no hay servicios múltiples en una sola aplicación.

var host = new ServiceHost(typeof(MyClass1), new Uri[] { new Uri("net.pipe://localhost") }); 
host.AddServiceEndpoint(typeof(ISomeInterface), new NetNamedPipeBinding(), "FOO"); 
host.Open(); 

Cambio "FOO" para cada aplicación, pero todavía no puedo iniciar varios Servicios. supongo que es bastante simple, pero im pegado :(

Saludos

Respuesta

8

acercarse a ella como esto va a hacer lo que quiera, yo creo:

string relativeUriPart = GetUniquePartFromConfigOfThisApplicationInstance(); 
var host = new ServiceHost(typeof(MyClass1)); // No base addresses specified 
host.AddServiceEndpoint(
    typeof(ISomeInterface), 
    new NetNamedPipeBinding(), 
    "net.pipe://localhost/" + relativeUriPart); // Specify absolute URI for endpoint 
host.Open(); 

Esto se debe a que, si se especifica una dirección de base que utiliza el esquema de net.pipe, es esta dirección de base que se utiliza para derivar el nombre de la tubería utilizado por el oyente [consulte la edición a continuación], y esto es igual en cada instancia de la aplicación, de modo que solo el oyente de la primera aplicación puede crear la tubería; los demás fallan como ha notado.

Utilizando el URI absoluto en el nivel de punto final, sin dirección base, el detector se crea con un nombre de canal derivado [ver edición más abajo] del URI absoluto completo, que es diferente en cada instancia de aplicación, por lo que cada aplicación El oyente puede crear su propio conducto distintivo sin ningún problema.


EDIT: Para ser más precisos, el nombre propio tubo no se deriva de la dirección del servicio en absoluto - es un GUID que cambia cada vez que se abre el servicio. Lo que es derivado de la dirección del servicio es el nombre de un objeto de memoria compartida a través del cual se publica el nombre real de la tubería para clientes potenciales. See here for more details.

0

Si es necesario crear hosts de servicios para diferentes contratos de servicio como espectáculo aquí:

...  
host1 = new SeviceHost(typeof(MyClass1, ...); 
host2 = new ServiceHost(typeof(MyClass2, ...); 
... 

entonces es necesario utilizar base diferente direcciones para cada nuevo ServiceHost como lo sugiere la respuesta de Mathew. Si todos sus servidores de servicio son para el mismo tipo de (MyClass1), entonces puede que necesite crear múltiples puntos finales para ese mismo servicio. Cada punto final podría ser para una interfaz diferente (es decir, ISomeInterface1, ISomeInterface2, ...) en ese servicio.

+0

Quiero ejecutar múltiples aplicaciones, no múltiples servicios en una aplicación. – Jaster

+0

¿Podría definir "aplicación"? Si su aplicación utiliza contratos de servicios múltiples (interfaces), se puede usar un único servicio WCF con un único host siempre que agregue un punto final para cada interfaz implementada. Si ha creado múltiples servicios WCF que implementan una interfaz diferente, debe usar un ServiceHost por separado para cada servicio. –

+0

solicitud = proceso. En otras palabras: quiero un par de procesos para alojar el mismo servicio en diferentes "direcciones". – Jaster