歡迎光臨
每天分享高質量文章

.NET Core 3.0建立一個Windows服務

來自:Rwing

連結:http://www.cnblogs.com/Rwing/p/net-core-workers

原文連結:https://devblogs.microsoft.com/aspnet/net-core-workers-as-windows-services/

 

在 .NET Core 3.0 中,我們引入了一種名為 Worker Service 的新型應用程式模板。此模板旨在為您在 .NET Core 中編寫長時間執行的服務的提供一個起點。

 

在本演練中,我們將建立一個 worker 並將其作為 Windows 服務執行。

建立一個 Worker

註意:在我們的預覽版中,worker 模板與 Web 模板位於同一級選單中。這將在未來的版本中發生變化。

 

我們打算將 Worker Service 模板直接放在“建立新專案”選單中。

 

在 Visual Studio 中建立 Worker

 

 

在命令列中建立 Worker

 

執行 dotnet new worker

 

作為 Windows 服務執行

為了作為 Windows 服務執行,我們需要我們的 worker 監聽來自 ServiceBase 的啟動停止訊號,該型別將 Windows 服務系統暴露給 .NET 應用程式。

 

要做到這一點,我們希望:

 

新增 Microsoft.Extensions.Hosting.WindowsServices NuGet 包

 

 

在 Program.cs 的 HostBuilder 中新增對 UseServiceBaseLifetime 的呼叫

 

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();
            });
}

 

這個方法做了兩件事:

 

首先,它檢查應用程式是否真正的作為 Windows 服務執行,如果不是,那麼它什麼都不做,這使得這個方法很安全,當本地執行或作為 Windows 服務執行時。您不需要向其新增保護陳述句,只需在未作為 Windows 服務安裝時正常執行應用程式即可。

 

其次它將配置host使用ServiceBaseLifetime,ServiceBaseLifetime與ServiceBase 一起使用,以幫助控製作為 Windows 服務執行時應用程式的生命週期。這會改寫處理 CTRL + C 等訊號的預設的 ConsoleLifetime 。

安裝 Worker

一旦我們的 worker 使用 ServiceBaseLifetime,我們就需要安裝它:

 

首先,讓我們釋出應用程式。如果我們立刻安裝了 Windows 服務,這意味著只要服務執行,exe 就會被鎖定。釋出這一步是個很好的方法, 以確保我需要執行服務的所有檔案都在一個位置, 並準備好安裝。

 

dotnet publish -o c:codeworkerpub

 

然後我們就可以在命令列中使用 sc 命令來安裝

sc create workertest binPath=c:codeworkerpubWorkerTest.exe

 

例如:

 

 

安全說明:此命令將服務使用 local system 執行,這通常不是您想要做的事情。相反,您應該建立一個服務帳戶並以該帳戶執行 Windows 服務。我們不會在這裡討論這個問題,但是有一些檔案在這裡討論它: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-2.2

日誌

日誌記錄系統有Event Log的提供程式,可以將日誌訊息直接傳送到 Windows事件日誌。

 

安裝 Microsoft.Extensions.Logging.EventLog 並修改 Program.cs :

 

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

未來工作

在即將到來的預覽版中,我們計劃透過以下方式改善使用 Worker 的體驗:

 

  • 將 UseWindowsServiceBaseLifetime 重新命名為 UseWindowsService

  • 作為 Windows 服務執行時,自動的整合 Event Log 日誌。

結論

我們希望您試用這個新模板,並希望您告訴我們它有什麼問題,您可以在此處提出任何錯誤或建議:https://github.com/aspnet/AspNetCore/issues/new/choose

已同步到看一看
贊(0)

分享創造快樂