2009-05-08 26 views
9

Chcę, aby dana aplikacja (usługa systemu Windows) działała jako serwer zdalny, a także jako klient zdalny. W produkcji uruchomię dwa wystąpienia mojej aplikacji, monitorując się nawzajem .NET Remoting i odpowiednio zgłosię awarie.Kanał "tcp" jest już zarejestrowany

Napisałem podstawowe elementy, a uzyskanie "Tcp kanału" jest już zarejestrowane "wyjątek .. Chcę programowo ustawić kanał.

Odpowiedz

7

Kanał o określonym numerze portu może zostać utworzony tylko przez jedno wystąpienie aplikacji. Musisz użyć różnych numerów portów i nazw kanałów dla każdej instancji.

Wymaga to użycia oddzielnych szablonów kanałów (jeśli używasz szablonów?).

+0

Porty są di fferent .. –

+0

@ Khurram Aziz - Więc każda instancja otwiera różne porty (zamiast każdej instancji otwiera wiele portów, ale używa różnych)? – stevehipwell

+0

@ Khurram Aziz - Czy masz oba kanały używające różnych nazw? – stevehipwell

2

Możesz utworzyć tylko ten sam kanał z tym samym numerem portu raz na AppDomain. Czy to jest złe?

+0

wydaje ... Service1 ma „VitalSigns” serwer słuchać na porcie 9001 i Usługa2 ma „VitalSigns” nasłuchiwania serwera na porcie 9002. Service1 sprawdzi istotne oznaki Usługa2 i obsługa 2 będzie kontrola Service1 Jeśli nie uruchomię serwera w jednej instancji i sprawdzę czy działa poprawnie ... ale chcę serwera/klienta w każdym –

12

Jak powiedzieli inni, jeśli nie określisz nazwy kanału, kod domyślnie używa "tcp", a każdy kanał musi mieć unikalną nazwę: więc podaj unikalną nazwę dla każdego otwieranego kanału ...

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