Worker Services是.netCore3中新增的創建后台服務的方法,它可以將應用部署成windows服務或linux守護程序。給后台開發的攻城師們提供了一個新武器。下面將創建一個基於Nancy的webapi,並給其添加windows(Linux)服務功能。
vs2019創建一個aps.net core web 應用程序的空項目

安裝Nuget包

- Microsoft.AspNetCore.Owin 用Owin技術使程序可以獨立運行
- Nancy 第三方webapi框架
- Microsoft.Extensions.Hosting.WindowsServices 用於給程序添加worker services的包
新增Hello.cs和Worker.cs文件
- Hello.cs 用於寫webapi相關內容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Nancy;
namespace Nancy.Test
{
public class Hello:NancyModule
{
public Hello()
{
Get("/", r => "Hello,Nancy,i am running on .NET Core 3.0");
Get("/{name}", r => "你好:" + r.name);
}
}
}
- Worker.cs 用於定義worker services的工作類
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Nancy.Test
{
public class Worker : BackgroundService
{
//private readonly ILogger<Worker> _logger;
//public Worker(ILogger<Worker> logger)
//{
// _logger = logger;
//}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
//while (!stoppingToken.IsCancellationRequested)
//{
//_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
//}
}
}
}
修改 Startup.cs 和 Program.cs 相關內容
- Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Nancy.Owin;
namespace Nancy.Test
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseOwin(x => x.UseNancy());//啟用Nancy
}
}
}
- Program.cs
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Nancy.Test
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.UseKestrel(options =>
{
options.AllowSynchronousIO = true; //允許同步方式,否則Nancy的同步方法訪問異常
});
})
.UseWindowsService()
.ConfigureServices((hostContext,services) =>
{
services.AddHostedService<Worker>();//添加windows服務模塊
})
;
}
}
程序發布
dotnet publish -c Release -o pub
發布后pub文件夾中生成對應的.exe文件
安裝為windows服務
- 使用sc.exe工具創建windows服務,用管理員權限打開命令行。
sc.exe create demoNancyHello binPath=E:\devloper\vs2019\Nancy.Test\Nancy.Test\pub\Nancy.Test.exe

-
查看windows服務,並啟動服務

- 刪除服務 sc.exe delete demoNancyHello
- 停止服務 sc.exe stop demoNancyHello
-
測試一下效果

部署到Linux
- 添加Microsoft.Extensions.Hosting.Systemd NuGet包
- 將UseSystemd()添加到主機構建器中
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSystemd() //使用systemd方式,部署linux服務
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
可以跨平台了。
參考:
.NET Core3.0創建Worker Services
最簡明扼要的 Systemd 教程,只需十分鍾
systemd創建自定義服務(Ubuntu)
