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
Bitte verwenden Sie das Ereignisprotokoll und eine separate Anwendung nur zum Überwachen. Sie können auch E-Mails oder MSMQ verwenden.
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.
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.
Sie könnten einige vorhandene Benachrichtigungs-App wie Growl verwenden: http://www.growlforwindows.com/gfw/. Dies würde dem Benutzer ermöglichen, sich zu "anmelden".
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.
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.
- 1. Der beste Weg, um einen Benutzer eindeutig zu identifizieren
- 2. Wo kann ich einen .Net Framework-Fehler melden?
- 3. Was ist der beste Weg für den Server, Nachrichten an einen Web-Client zu senden?
- 4. Was ist der beste Weg, um einen Pfad und einen Dateinamen in C# /. NET zu kombinieren?
- 5. beste Weg, um alle Benutzer für einen Satz von user_details
- 6. beste Weg, einen Butzen
- 7. Der beste Weg, um einen duplicateMovieClip zu löschen?
- 8. Der beste Weg, um einen WYSIWYG in Flex zu machen?
- 9. Was ist der beste Weg, um einen anderen Benutzer aus seiner Sitzung auf MacOS abzumelden?
- 10. Die beste Möglichkeit, UIInterfaceOrientation Änderungen an anderen ViewControllern zu melden
- 11. Wie ist der beste Weg, ein Login für einen Benutzer und einen Administrator in Laravel 5.2 zu erstellen?
- 12. Der beste Weg, um einen Cassandra-Cluster zu schrumpfen
- 13. Wo kann ich einen Git-Fehler melden
- 14. Der beste Weg, um Fehler zu behandeln
- 15. Der beste Weg, um einen Pfad zu machine.config einer anderen .NET-Version zu erhalten
- 16. Was ist der beste Weg, um einen IEnumerator in einen generischen IEnumerator zu konvertieren?
- 17. playframework - Der beste Weg, um einen JSON-Werte zu trimmen
- 18. Der beste Weg, um einen RESTful Service "Client" in .Net zu schreiben?
- 19. Der beste Weg, um einen Dateityp in PHP zu erkennen
- 20. Was ist der beste Weg, um einen Datenrahmen zu umgehen?
- 21. Was ist der beste Weg, um einen "Timer" zu implementieren?
- 22. Der beste Weg, um einen Download zu starten?
- 23. Was ist der beste Weg, um einen realistischen Highlighter in .NET (mit GDI +) zu erstellen?
- 24. Der beste Weg, um einen Release-Build von einem Debug-Build zu erkennen? .net
- 25. Was ist der beste Weg, um einen ByteArrayOutputStream zu schließen?
- 26. Was ist der beste Weg, um einen InputStream zu überwachen?
- 27. Melden Sie einen Windows-Benutzer auf einem Remote-Computer
- 28. Der beste Weg, einen Aufkleber in einem xmpp chatten
- 29. Was ist der beste Weg für einen Benutzer, seine 'Stadt' in einer Web-App einzugeben?
- 30. Der beste Weg, Audio und Video von einem Android-Telefon an einen RTMP-Server zu streamen