Wie kann ich überprüfen, ob eine WCF-Host verfügbar ist, bevor ich einen Kanal von einem Client benutzen?

StackOverflow https://stackoverflow.com/questions/1078037

Frage

Ich schaffe einen Windows-Dienst, der eine Anzahl von Slave-Prozesse gestartet. In jedem dieser Slave-Prozess beginne ich auf eine Named Pipe für Nachricht aus dem Prozess Master hören.

Im Moment habe ich die Situation, in dem Master-Prozess einen Slave über eine Named Pipe ruft, bevor der Slave vollständig gestartet und beginnt mit dem Named Pipe zu hören.

    ProcessStartInfo processStartInfo = new ProcessStartInfo("slave");
    processStartInfo.Arguments = Address 

    Process process = new Process();
    process.StartInfo = processStartInfo;

    process.Start();

    base.Endpoint.Binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
    base.Endpoint.Address = Address;

    base.Channel.RemoteMethod();

Wenn ich dies tue der Kanal wird in CommunicationState.Faulted und alle nachfolgenden Anrufe auf dem Kanal nicht als gut.

Was kann ich tun, von dem Master zu überprüfen, ob der Slave-Prozess hören beginnt? Oder wie kann ich von den CommunicationState.Faulted erholen meinen Remote-Aufruf erneut zu versuchen?

War es hilfreich?

Lösung

Der einzige Weg, aus dem Zustand Faulted wiederherzustellen, ist die WCF-Client durch erneute Aufbau der Instanz reiniailize und die Open () -Methode aufrufen.

In der Regel, bevor ich den Kundendienst anrufen, ich die Status-Eigenschaft immer überprüfen, und wenn es nicht geöffnet ist, ich versuche, es neu zu initialisieren, wie ich oben beschrieben. Wenn es fehlschlägt, gibt es ein Problem mit dem Server. (In meinem Fall wird der Staat aufgrund von Inaktivität bemängelt, so Initialisierung ussually succedes)

Andere Tipps

Sie können auf dem Host zu dem „ServiceFaulted“ Ereignis anhängen, und verwenden Sie diese Fehlerbehandlung durchzuführen. Gemäß der Dokumentation ist die richtige Aktion des Host abzubrechen. Sie können dann versuchen und neu initialisieren es, aber es kann eine Übung in Sinnlosigkeit, wenn das System heruntergefahren ist.

Vielleicht könnten Sie eine „Sitzung“ basierten Dienst implementieren. So öffnet sich der Client den WCF-Kanal und macht einen Aufruf, die Sitzung zu öffnen (z. B. ein „offenes“ Gespräch). Dies würde lassen Sie Ihre Gastgeber wissen, dass der Slave hört.

Sie möchten die Callback-Mechanismus der WCF untersuchen, so dass die Fernkommunikation an den Slave über einen Rückruf vom „offenen“ aufrufen, indem es gemacht vorgesehen ist, sobald es initialisiert hat.

Alex Drenea ist richtig zu sagen, dass Sie eine neue Instanz erstellen möchten. Ich würde empfehlen, für die Erstellung der Proxies einen Blick auf die Channel Klasse in WCF mit. Sie können mit einigem Try-Catch-Typ Verhalten verwenden, um dies mit der ersten Inbetriebnahme Ihres Slave zu beschäftigen. Sie können auch eine System.Diagnostics.Debugger.Break () in der Slave-Prozess Startcode platzieren möchten, wie der Debugger nicht so anbringen können Sie die Ausnahme in der Slave-Prozess nicht sehen.

Darf ich fragen, ob Sie brauchen, Prozessisolierung wirklich oder würde mit Synchronisation und Threads für Ihre Aufgabe ausreichend sein?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top