Worker Services是.netCore3中新增的创建后台服务的方法,它可以将应用部署成windows服务或linux守护程序。给后台开发的攻城师们提供了一个新武器。下面将创建一个基于Nancy的webapi,并给其添加windows(Linux)服务功能。
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);
}
}
}
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);
}
}
}
}
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
}
}
}
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文件
sc.exe create demoNancyHello binPath=E:\devloper\vs2019\Nancy.Test\Nancy.Test\pub\Nancy.Test.exe
查看windows服务,并启动服务
测试一下效果
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)
.netCore3 下利用worker services给应用添加windows(Linux)服务
原文:https://www.cnblogs.com/ihappycat/p/12003406.html