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

Schöpfungsarbeiter
Hinweis In unseren Vorabversionen 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 eines Workers in Visual Studio



Erstellen eines Workers in der Befehlszeile
Führen Sie dotnet new worker

Wird als Windows-Dienst ausgeführt
Um als Windows-Dienst zu starten, muss unser Mitarbeiter Start- und Stoppsignale vom Typ ServiceBase
.NET sehen, der Windows-Dienstsysteme mit .NET-Anwendungen verbindet. Dazu benötigen Sie:
Fügen Sie das NuGet-Paket Microsoft.Extensions.Hosting.WindowsServices

Fügen Sie UseServiceBaseLifetime
in HostBuilder
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 wirklich als Windows-Dienst funktioniert. Wenn dies nicht der Fall ist, werden Noops ausgeführt, wodurch diese Methode sicher aufgerufen werden kann, wenn sie lokal oder als Windows-Dienst ausgeführt wird.
Zweitens wird Ihr Host für die Verwendung von ServiceBaseLifetime
konfiguriert. ServiceBaseLifetime
arbeitet mit ServiceBase
, um die Lebensdauer Ihrer Anwendung zu steuern, wenn diese als Windows-Dienst gestartet wird. Dies überschreibt die Standard- ConsoleLifetime
die Signale wie CTL + C verarbeitet.
Installieren Sie Worker
Sobald der Worker ServiceBaseLifetime
, müssen wir ServiceBaseLifetime
festlegen:
Lassen Sie uns zuerst die App veröffentlichen. Wir werden den Windows-Dienst direkt installieren, was bedeutet, dass die ausführbare Datei bei jedem Start des Dienstes blockiert wird. Durch das Veröffentlichen können Sie sicherstellen, dass sich alle zum Starten des Dienstes erforderlichen Dateien an einem Ort befinden und zur Installation bereit sind.
dotnet publish -oc:\code\workerpub
Als Nächstes können Sie das Dienstprogramm sc in der Befehlszeile admin verwenden
sc create workertest binPath=c:\code\workerpub\WorkerTest.exe
Zum Beispiel:

Sicherheitshinweis: Dieser Befehl startet den Dienst als lokales System, was nicht erforderlich ist . Stattdessen sollten Sie ein Dienstkonto erstellen und den Windows-Dienst als dieses Konto starten. Wir werden hier nicht darüber sprechen, aber es gibt hier einige ASP.NET-Dokumentationen: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore- 2.2
Protokollierung
Das Protokollierungssystem verfügt über einen Ereignisprotokolldienst, der Protokollnachrichten direkt an das Windows-Ereignisprotokoll senden kann. Um in das Ereignisprotokoll einzutreten, 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>(); });
Weitere Arbeit
In den folgenden Voransichten planen wir, die Verwendung von Workern mit Windows-Diensten zu verbessern:
- Benennen Sie UseWindowsServiceBaseLifetime in UseWindowsService um
- Fügen Sie beim Start als Windows-Dienst eine automatische und verbesserte Integration in das Ereignisprotokoll hinzu.
Fazit
Wir hoffen, dass Sie unsere neue Vorlage ausprobieren und wissen möchten, wie sie funktioniert. Sie können hier Fehlermeldungen oder Vorschläge senden: https://github.com/aspnet/AspNetCore/issues/new/choose
