2009-12-11 6 views
6

Ich schreibe einen Windows-Dienst, der eine Menge Netzwerkkommunikation tun wird, und ich brauche eine Möglichkeit, einen Benutzer (falls angemeldet) von einem zu benachrichtigen Ausnahmen/Fehler. Ich weiß, dass es eine schlechte Übung ist, einem Dienst die Interaktion mit dem Desktop zu erlauben. Gibt es also eine alternative Möglichkeit, einen Benutzer darüber zu informieren, dass ein Fehler aufgetreten ist? Ich bin mir der Ereignisprotokollierung bewusst, möchte aber auch eine Benachrichtigungsblase aus der Taskleiste anzeigen oder etwas, das die Aufmerksamkeit des Benutzers erregt.Der beste Weg für einen .Net Windows-Dienst einen Fehler an den Benutzer zu melden

Antwort

7

Bitte verwenden Sie das Ereignisprotokoll und eine separate Anwendung nur zum Überwachen. Sie können auch E-Mails oder MSMQ verwenden.

4

Wie wäre es mit einer anderen App, um mit dieser Anwendung zu interagieren und den Benutzer über die Fehler zu benachrichtigen? Auf diese Weise können Sie "Option" für Benutzer haben. Abschaltbenachrichtigungen, E-Mail usw.

5

Normalerweise haben Sie eine sekundäre App, die der Dienst benachrichtigen kann. Zum Beispiel können Sie ein Taskleistensymbol (ugh) haben, das Ballons (Doppelpfeil) öffnet, wenn etwas Wichtiges passiert. Die App selbst kann dann auch eine Schnittstelle für Einstellungen für Ihren Service bereitstellen.

2

Sie müssen eine Alternative zur Option "Mit Desktop interagieren" bereitstellen. Es wird nicht mehr in Vista und Win7 unterstützt. Einem eingeschränkten Benutzer den Zugriff auf eine Benutzeroberfläche zu gewähren, die auf einem hoch privilegierten Konto ausgeführt wird, galt als zu großes Sicherheitsrisiko. Google "Sitzung 0 Isolation", um Details dazu zu finden.

Sie müssen einen der von .NET unterstützten Prozess-Interop-Mechanismen verwenden, um die Interaktion zwischen Ihrem Service und einer UI-App einzurichten. Für die einfache Nachrichtenübergabe verwenden Sie entweder einen Socket oder eine Named Pipe. Der Pipe-Name muss das Präfix "Global" haben, damit er für alle Sitzungen sichtbar ist. Für komplexere Interaktionen können Sie Remoting oder WCF verwenden.

Achten Sie darauf, sich mit der Möglichkeit zu befassen, dass der Benutzer entscheidet, die Desktop-App nicht auszuführen oder zu beenden. Sie sollten jeden Fehler mit der EventLog-Klasse protokollieren.

1

Um dieses Problem zu lösen, habe ich eine Windows Forms-Anwendung erstellt, die der Benutzer beliebig starten und stoppen kann. Natürlich läuft der Windows-Dienst rund um die Uhr im Hintergrund. Wenn die Anwendung gestartet wird, fragt Windows Communication Foundation (WCF) den Dienst nach dem aktuellen Status ab - ist aktiv, wie viele Clients sind verbunden, wie viele Byte wurden gesammelt usw. Diese Information wird dann dem Benutzer angezeigt in der Anwendung.

Ich habe versucht, das Verhalten des Task-Managers nachzuahmen, also habe ich auch eine System.Windows.Forms.NotifyIcon zum Hauptformular der Anwendung hinzugefügt, die ein Symbol in der Taskleiste anzeigt. Wenn die Anwendung geöffnet ist, wird das Taskleistensymbol angezeigt. Der Benutzer kann die Anwendung auf die Taskleiste minimieren oder die Anwendung vollständig ausblenden. Das Taskleistensymbol verschwindet nur, wenn der Benutzer die Anwendung schließt. Das Taskleistensymbol unterstützt auch Doppelklicks zum erneuten Öffnen der Anwendung und ein Popup-Menü für schnellen Zugriff auf die Funktionen.

In jedem Fall ist der Punkt, den ich machen möchte, dass WCF der einfachste Weg ist, Ihre Service- und Front-End-Anwendung zu kommunizieren. Die Leute werden über die vermeintlich "steile" Lernkurve streiten, die mit der WCF verbunden ist, aber das habe ich nicht erlebt. Ich finde, WCF ist ein sehr effizienter Weg, um die Kommunikation zwischen den Prozessen zu entwickeln. Sie können this video ansehen, um Ihnen einen Einblick in das WCF-Programmierparadigma zu geben.

Verwandte Themen