2009-05-08 13 views
9

Quiero que la aplicación determinada (Servicio de Windows) actúe como un servidor remoto y un cliente remoto. En producción, ejecutaré las dos instancias de mi aplicación supervisándome entre sí a través de .NET Remoting y reportaré las fallas en consecuencia.El canal 'tcp' ya está registrado

He escrito unas piezas básicas, y obtengo "El canal 'tcp' ya está registrado" excepción..Quiero configurar la configuración del canal mediante programación.

Respuesta

7

Un canal con un número de puerto específico solo puede ser creado por una instancia de aplicación. Necesita usar diferentes números de puerto y nombres de canal para cada instancia.

Esto requiere el uso de plantillas de canales independientes (si está utilizando plantillas?).

+0

Los puertos son di fferent .. –

+0

@Khurram Aziz - Entonces cada instancia abre puertos diferentes (en lugar de que cada instancia abra múltiples puertos, pero usa diferentes) – stevehipwell

+0

@Khurram Aziz - ¿Tienes ambos canales con diferentes nombres? – stevehipwell

2

Solo puede crear el mismo canal con el mismo número de puerto una vez por AppDomain. ¿Es eso lo que está mal?

+0

... parece El Servicio1 tiene "vitalsigns" servidor escucha en el puerto 9001 y tiene Servicio2 "vitalsigns" servidor escucha en el puerto 9002. El Servicio1 revisará los signos vitales de Servicio2 y servicio 2 comprobará de Service1 Si no ejecuto el servidor en una instancia y compruebo que funciona bien ... pero quiero servidor/cliente en cada –

12

Como han dicho otros, si no especifica el nombre del canal, el código por defecto usa "tcp" y cada canal debe tener un nombre único: así que especifique un nombre único para cada canal que abra ...

int tcpPort = 52131; 
    // ------------------------------------------------------------ 
    BinaryServerFormatterSinkProvider serverProv = 
     new BinaryServerFormatterSinkProvider(); 
    serverProv.TypeFilterLevel = TypeFilterLevel.Full; 
    RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off; 

    serverProv.TypeFilterLevel = TypeFilterLevel.Full; 
    IDictionary propBag = new Hashtable(); 
    // ----------------------------------------- 
    bool isSecure = [true/false]; 
    propBag["port"] = tcpPort ; 
    propBag["typeFilterLevel"] = TypeFilterLevel.Full; 
    propBag["name"] = "UniqueChannelName"; // here enter unique channel name 
    if (isSecure) // if you want remoting comm to be secure and encrypted 
    { 
     propBag["secure"] = isSecure; 
     propBag["impersonate"] = false; // change to true to do impersonation 
    } 
    // ----------------------------------------- 
    tcpChan = new TcpChannel(
     propBag, null, serverProv); 
    ChannelServices.RegisterChannel(tcpChan, isSecure); 
    // -------------------------------------------- 

    string uRI = MyUniversalResourceIndicatorName; 
    // --------------------------------------------- 

    RemotingConfiguration.RegisterWellKnownServiceType(
     typeof(ImportServiceManager), uRI , 
     WellKnownObjectMode.SingleCall); 
+1

"int tcpPort = 82131;" WTF. 82131, 65535? – Behrooz

Cuestiones relacionadas