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



Erstellen Sie einen Worker in der Befehlszeile
Führen Sie dotnet new worker

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

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:

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:
- Benennen Sie UseWindowsServiceBaseLifetime in UseWindowsService um
- 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
