Gegeben:
- die Anwendung - Desktop-GUI (WPF) .NET app
- Windows-Dienst für die Anwendung beobachten (.NET auch)Verbindung über Named Pipe von Windows-Dienst (Session # 0) zu Desktop-Anwendung (Session # 1)
Der Windows-Dienst "pingt" regelmäßig Anwendung, um sicherzustellen, dass es gesund ist (und wenn es nicht ist winservice wird es neu starten).
Ich würde "pingen" über Named Pipes implementieren. Um die Dinge einfacher zu machen, habe ich beschlossen, es mit WCF zu machen. Die Anwendung hostet einen WCF-Dienst (eine Operation, die etwas zurückgibt). Der Windows-Dienst ist ein Client für diesen WCF-Dienst und ruft ihn auf der Grundlage eines Zeitgebers periodisch auf.
Das ist alles in Windows 7.
Windows-Dienst läuft unter LocalService (in Sitzung # 0).
Desktop-Anwendung läuft unter derzeit angemeldeten Benutzer (in Sitzung # 1).
Das Problem:
Windows-Dienst WCF Endpunkt nicht sehen kann (mit NetNamedPipeBinding) erstellt in und in Desktop-Anwendung gehört zu werden. Das bedeutet, dass bei Aufruf über den Proxy-Server ich diese Ausnahme bekomme: "Der Pipe-Endpunkt 'net.pipe: // localhost/HeartBeat' konnte auf Ihrem lokalen Rechner nicht gefunden werden"
Ich bin mir sicher Code ist ok, denn Eine andere Desktopanwendung (in Sitzung 1) kann den Endpunkt sehen.
Offensichtlich hier habe ich mit einigen Sicherheits-Sachen für Win32-System-Objektisolierung beschäftigt. Aber ich glaube, es sollte einen Weg geben, um Workaround-Einschränkungen, denen ich begegnet bin.
Ich kann den WCF-Ansatz opfern und den rohen NamedPipe-Weg gehen.
Sind Sie sicher, dass der Windows-Dienst versucht, den Kanal zu öffnen, nachdem die Desktop-Anwendung ausgeführt wird? Wenn der Windows-Dienst den WCF-Endpunkt nicht sehen kann, was sind die Details der Ausnahme? –
> # 1: ja, da bin ich mir sicher, weil der winservice das (per wff anruf) periodisch (in endlosschleife) macht. – Shrike
> # 2: Der Winservice "kann nicht sehen" bedeutet, dass beim Aufruf eines wcf-Proxy die folgende Ausnahme auftritt: "Der Pipe-Endpunkt 'net.pipe: // localhost/HeartBeat' konnte auf Ihrem lokalen Rechner nicht gefunden werden" – Shrike