.netCore3 下利用worker services給應用添加windows(Linux)服務


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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM