Erstellung einer Benutzeroberfläche für die überwachung und die Interaktion mit einer Laufenden windows-Dienst
Muss ich laufen eine Reihe von austauschbaren Prozesse in einem windows-Dienst auf meinem server und möchten, erstellen Sie eine Benutzer-Schnittstelle, die mir erlaubt, zu interagieren mit den einzelnen plugins in Verwendung durch den Dienst.
Was ist die gängigste Methode (oder Methoden) für die Kommunikation zwischen einem Benutzer-interface und eine lange laufende windows-Dienst? Ich bin am überlegen, die einen go-zwischen Ort, wie zum Beispiel eine Datenbank und über irgendeine Art von messaging-queue-Befehle an den Dienst. Hat jemand von Euch schon umgesetzt, wie eine Annäherung oder eine andere überlegene Ansatz? Auf welche Probleme Sie stoßen in den Prozess ein?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht mit remoting! Während es wird sicherlich funktionieren, Microsoft sagt, dass remoting ist eine legacy-Technologie und alle neuen verteilten Anwendungen entwickelt werden, mithilfe von WCF. Sehen hier für mehr details.
Windows Communication Foundation (WCF) ist das empfohlene Verfahren für zwei .NETTO-Prozesse, um miteinander zu kommunizieren. WCF bietet ein einheitliches Programmiermodell, das vereinfacht die verteilte Entwicklung durch die Abstraktion können viele der Komplexitäten im Zusammenhang mit bestimmten Kommunikations-Mechanismen, z.B. sockets, pipes, etc.
Gegeben, die details deiner situation, würde ich vorschlagen, machen jeden Windows-Dienst plugin ist ein WCF service. Für jeden WCF-Dienst, d.h., plugin, definieren Sie die Schnittstelle, die es braucht, um über Ihre Benutzeroberfläche. Die Schnittstelle ist einfach eine C# - Schnittstelle geschmückt mit den ServiceContract Attribut. Dieses interface enthält die Methoden, von denen jede ist geschmückt mit der OperationContract Attribut, dass Ihre Benutzeroberfläche verwenden, um die Kommunikation mit dem WCF-service - (plugin -). Diese Methoden akzeptieren kann und wieder alle serialisierbar sind .NET-Typ oder, wie es oft der Fall, Ihre eigenen benutzerdefinierten Typen. Verwenden von benutzerdefinierten Typen, die mit WCF, einfach dekorieren Sie mit den DataContract Attribut und markieren Sie die Elemente, die Sie wollen ausgetauscht werden, die über WCF mit dem DataMember Attribut.
Sobald Sie Ihre ServiceContract - Schnittstelle definiert ist, definieren Sie eine Klasse, die diese Schnittstelle implementiert. Jeder OperationContract Methode tut, was es tun muss, z.B. die Interaktion mit der Datenbank, berechnen Sie einen Wert, usw. Sobald Sie dies getan haben, Sie haben effektiv definiert einen WCF-Dienst. Hier eine kurze, aber die Arbeit, Beispiel:
Ist der nächste Schritt auf diesem host WCF-Dienst, der verfügbar ist für die Verwendung durch Ihre Benutzeroberfläche. Da werden Sie mit einem Windows-Dienst, hosting von WCF-service ist einfach genug, in der
OnStart()
Rückruf von Ihrem Windows-Dienst, etwa so:Die einzige Sache Links zu tun ist die Definition einer app.config-Datei für Ihr Windows-Dienst, der konfiguriert wird, bestimmte erforderlichen Aspekte Ihrer WCF-Dienst. Dies mag wie overkill, aber zwei Dinge im Hinterkopf behalten. Erste von allen, in Visual Studio können Sie die Basis-app.config-Datei automatisch, wenn Sie fügen Sie eine WCF-service-Klasse zu Ihrem Projekt. Zweitens, die app.config-Datei gibt Ihnen eine enorme Menge an Kontrolle über Ihre WCF-service, ohne änderungen am code. Hier ist die companion app.config-Datei für das Beispiel oben:
Beachten Sie, dass die AdditionService WCF-Dienst hat zwei Endpunkte. Die metadata exchange Endpunkt benutzt wird, die für die code-Erzeugung durch den client, so ignorieren Sie für jetzt. Der erste Endpunkt ist, so konfiguriert, dass NetNamedPipeBinding. Dies ist die verbindlich zu verwenden, wenn die Benutzeroberfläche und den Windows-Dienst ausgeführt wird, auf der gleichen Maschine (siehe hier für ein Flussdiagramm für die Auswahl der geeigneten Bindung zu verwenden). Jedoch ist diese Bindung nicht verwendet werden, wenn die Benutzeroberfläche und den Windows-Dienst ausgeführt wird, auf verschiedenen Rechnern. In diesem Fall könnten Sie die NetTcpBinding als Ersatz. Als Ersatz für die NetTcpBinding für die NetNamedPipeBinding, Sie würden einfach brauchen, um die Adresse zu ändern und die Bindung der Endpunkt, wie diese:
Ohne code-änderungen sind erforderlich! Die änderung vornehmen, starten Sie den Dienst neu, und Ihre WCF-service ist jetzt verfügbar an remote-Maschinen. Sie können sich sogar erlauben, mehrere Endpunkte für den gleichen WCF-Dienst, wenn Sie so gewünscht. Der Punkt ist, die app.config-Datei bietet eine enorme Flexibilität, ohne dass änderungen am code.
Das ist es! Jetzt haben Sie einen WCF-Dienst gehostet in Ihrer Windows-service verfügbar für die Verwendung von UI.
Also, wie sieht die UI-Seite, D. H., der client-Seite arbeiten?
Dies ist, wo die wirkliche macht der WCF ins Spiel kommt. Wenn erste Schritte mit WCF, die einfachste Sache zu tun ist, nutzen die Visual Studio-code-generierungsfunktionen. Stellen Sie sicher, dass Ihr Windows-Dienst (der ein hosting der AdditionService) ausgeführt wird. In Ihren UI-Projekt mit der rechten Maustaste auf Ihr Projekt im Projektmappen-Explorer und wählen Sie die Add Service Reference... Menü-option. In der Adresse Feld
net.pipe://localhost/AdditionService
, und klicken Sie auf die Gehen - Taste. Sie sollten sehen, die AdditionService zeigen sich in der Dienstleistungen Liste. In der Namespace FeldAdditionService
und klicken Sie auf die OK - Taste.Diesen Schritten erzeugen Sie ein client-proxy und korrekt definiert-app.config-Datei, die Hinzugefügt werden, um Ihre UI-Projekt. Dieser client proxy wird Ihr client-Seite AdditionService-API verwenden, und verwenden Sie es wie folgt:
Merken, wie einfach dies ist. Im Grunde ein client-proxy,
AdditionServiceClient
, instanziiert wird. Dann zweiComplex
- Objekte erstellt werden. Endlich, dieAdd()
- Methode auf dem client-proxy aufgerufen wird, und einComplex
Ergebnis zurückgegeben.Was Los ist hinter den kulissen ist, dass die
Add()
- Methode des client-proxy ist eigentlich vorbei, die zweiComplex
Objekte der AdditionService WCF-Dienst gehostet wird, in den Windows-Dienst. Die AdditionService führt die addition und dann gibt das Ergebnis zurück. All dies geschieht über eine named pipe, aber feststellen, dass es keine named pipe-spezifischen code hier! WCF abstrahiert alle, dass die Komplexität hinter einem Programmiermodell, das definiert ist durch die IAdditionService-Schnittstelle.Ich weiß, das ist eine Menge Informationen zu verdauen, aber ich hoffe, es ist deutlich, wie leistungsfähig und einfach zu verwenden WCF werden kann. Natürlich, dieses Beispiel trifft nur einen kleinen Teil von allem, was verfügbar ist in WCF.
In das Ende, obwohl, WCF, sollte der Mechanismus Sie verwenden, um die Kommunikation zwischen der Benutzeroberfläche und der Windows-Dienst. Für mehr Informationen, ich würde empfehlen, Juval LÖWY Buch Programming WCF Services für alle Dinge, die von WCF. Sie können auch besuchen Sie seine website, IDesign.net, kostenlos WCF code-Beispiele. Weitere Einführung in die WCF, sehen Sie dieses free video bei dnrTV. Es deckt den Zweck der WCF und zeigt WCF-Programmierung durch einige leicht verständliche Beispiele.
Ihre beste Wette ist, um zu verwenden .NET remoting über IPC-Kanal.
Während es scheint schwierig zu setup, es ist ziemlich einfach, das zweite mal herum.
Ich schlage vor, Sie spielen mit ein paar Proben zuerst auf Verfügbarmachen von remotefähige Objekte von einer Anwendung zu einer anderen.
Habe ich nicht verwendet, Message queues vor, so dass ich kann nicht kommentieren, die.