轉換 Worker Service 為 Windows Service

為工作紀錄。.NET6。

關鍵知識

本以為 .NET6 的 Worker Service 本身就是 Windows Service,實際上並不是。仍有轉換步驟,原因應該是其可以部署的標的除了 Windows 外 Linux 等其他平台也可以的樣子。

Worker Service 轉換成 Window Service

只要二步驟:

一、安裝:Microsoft.Extensions.Hosting.WindowsServices 套件。

二、在 Program 類別 CreateHostBuilder 處加上 UseWindowsService(),完工。

部署步驟:

三、以 Release 模式發行到目的地。

四、用 sc.exe 指令註冊到系統。

三、用 services.msc 工具管理服務。

源碼紀錄

Program.cs
using Serilog;
using Serilog.Sinks.MSSqlServer;
using System.Collections.ObjectModel;
using System.Data;

///// 設定工作目錄,若取不到 Configuration 的話。
//Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureLogging((ctx, logging) =>
    {
      //## 懶人版 資料庫連線初始化
      DBHelper.CONNDB = new ConnProxy(ctx.Configuration["ConnectionStrings:CONNDB"]);
 
      var columnOptions = new ColumnOptions();
      columnOptions.Store.Remove(StandardColumn.Properties);
      columnOptions.Store.Remove(StandardColumn.MessageTemplate);
      columnOptions.Store.Add(StandardColumn.LogEvent);
      columnOptions.AdditionalColumns = new Collection<SqlColumn>
      {
          new SqlColumn{ColumnName = "JobId", DataType = SqlDbType.VarChar, DataLength = 50},
      };

      Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(ctx.Configuration)
        .Enrich.FromLogContext()
        .AuditTo.MSSqlServer(
          connectionString: DBHelper.CONNSLP.ConnStr,
          sinkOptions: new MSSqlServerSinkOptions() { TableName = "JobSerilog", AutoCreateSqlTable = false },
          columnOptions: columnOptions)
        .CreateLogger();

      logging.AddSerilog();
    })
    .ConfigureServices((ctx, services) =>
    {
      //# 註冊相依 Services

      //# 加掛排程執行緒
      services.AddHostedService<YourJob10Worker>();
      services.AddHostedService<YourJob20Worker>();
      services.AddHostedService<YourJob30Worker>();
    })
    .UseWindowsService()
    .Build();

await host.RunAsync();

Worker Service 轉換成 Linux Deamon Service

只要二步驟:

一、安裝:Microsoft.Extensions.Hosting.Systemd 套件。

二、在 Program 類別 CreateHostBuilder 處加上 UseSystemd(),完工。

參考文件

Last updated