.NET Core Worker als Windows-Dienste

In .NET Core 3.0 führen wir eine neue Art von Anwendungsvorlage namens Worker Service ein. Diese Vorlage soll Ihnen einen Ausgangspunkt für das Schreiben von Diensten mit langer Laufzeit in .NET Core geben. In dieser exemplarischen Vorgehensweise erstellen wir einen Worker und führen ihn als Windows-Dienst aus.



Erstellen Sie einen Arbeiter


Vorschau Hinweis: In unseren Vorschauversionen befindet sich die Worker-Vorlage im selben Menü wie die Webvorlagen. Dies wird sich in einer zukünftigen Version ändern. Wir beabsichtigen, die Worker Service-Vorlage direkt im Assistenten zum Erstellen neuer Projekte zu platzieren.


Erstellen Sie einen Worker in Visual Studio


Bild


Bild


Bild


Erstellen Sie einen Worker in der Befehlszeile


Führen Sie dotnet new worker


Bild


Als Windows-Dienst ausführen


Um als Windows-Dienst ausgeführt zu werden, muss unser Mitarbeiter auf Start- und Stoppsignale von ServiceBase dem .NET-Typ, warten, der die Windows-Dienstsysteme für .NET-Anwendungen verfügbar macht. Dazu möchten wir:


Fügen Sie das NuGet-Paket Microsoft.Extensions.Hosting.WindowsServices


Bild


Fügen UseServiceBaseLifetime dem HostBuilder in unserer UseServiceBaseLifetime den UseServiceBaseLifetime Aufruf HostBuilder


 public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceBaseLifetime() .ConfigureServices(services => { services.AddHostedService<Worker>(); }); } 

Diese Methode macht ein paar Dinge. Zunächst wird überprüft, ob die Anwendung tatsächlich als Windows-Dienst ausgeführt wird oder nicht. Wenn dies nicht der Fall ist, wird diese Methode sicher aufgerufen, wenn sie lokal oder als Windows-Dienst ausgeführt wird. Sie müssen keine Schutzklauseln hinzufügen und können die App einfach normal ausführen, wenn sie nicht als Windows-Dienst installiert ist.


Zweitens wird Ihr Host für die Verwendung einer ServiceBaseLifetime konfiguriert. ServiceBaseLifetime arbeitet mit ServiceBase , um die Lebensdauer Ihrer App zu steuern, wenn sie als Windows-Dienst ausgeführt wird. Dies überschreibt die Standard- ConsoleLifetime , die Signale wie CTL + C verarbeitet.


Installieren Sie den Worker


Sobald unser Mitarbeiter die ServiceBaseLifetime wir sie installieren:


Lassen Sie uns zunächst die Anwendung veröffentlichen. Wir werden den Windows-Dienst direkt installieren, was bedeutet, dass die Exe gesperrt wird, wenn der Dienst ausgeführt wird. Der Veröffentlichungsschritt ist eine gute Möglichkeit, um sicherzustellen, dass sich alle Dateien, die ich zum Ausführen des Dienstes benötige, an einem Ort befinden und zur Installation bereit sind.


 dotnet publish -oc:\code\workerpub 

Dann können wir das Dienstprogramm sc in einer Admin-Eingabeaufforderung verwenden


 sc create workertest binPath=c:\code\workerpub\WorkerTest.exe 

Zum Beispiel:


Bild


Sicherheitshinweis: Bei diesem Befehl wird der Dienst als lokales System ausgeführt, was Sie normalerweise nicht möchten . Stattdessen sollten Sie ein Dienstkonto erstellen und den Windows-Dienst als dieses Konto ausführen. Wir werden hier nicht darüber sprechen, aber es gibt einige Dokumentationen in den ASP.NET-Dokumenten, die hier darüber sprechen: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows- service? view = aspnetcore-2.2


Protokollierung


Das Protokollierungssystem verfügt über einen Ereignisprotokollanbieter, der Protokollnachrichten direkt an das Windows-Ereignisprotokoll senden kann. Um sich im Ereignisprotokoll anzumelden, können Sie das Paket Microsoft.Extensions.Logging.EventLog hinzufügen und anschließend Ihre Program.cs ändern:


 public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); }); 

Zukünftige Arbeit


In den kommenden Voransichten planen wir, die Erfahrung mit der Verwendung von Workern mit Windows-Diensten zu verbessern, indem:


  1. Benennen Sie UseWindowsServiceBaseLifetime in UseWindowsService um
  2. Fügen Sie eine automatische und verbesserte Integration in das Ereignisprotokoll hinzu, wenn Sie als Windows-Dienst ausgeführt werden.

Fazit


Wir hoffen, dass Sie diese neue Vorlage ausprobieren und uns mitteilen möchten, wie sie funktioniert. Sie können hier Fehler oder Vorschläge einreichen: https://github.com/aspnet/AspNetCore/issues/new/choose


Avatar
Glenn Kondron

Source: https://habr.com/ru/post/de446508/


All Articles