.Net Core 3.X WebApi 自宿主并注册成Windows服务

.Net Core 3.X WebApi 自宿主并注册成Windows服务

.net core跨平台之后,部署方式也变得多了。在Windows上可以IISKestrelWindows 服务,我之前做的一个项目,用的Kestrel前面再加了一层Nginx代理。因为之前.net的时候部署老是用IIS,感觉有点繁琐,所以这次就来探究一下Windows 服务的方式。

基于WindowsServices创建服务

首先,我们需要安装一个组件Microsoft.Extensions.Hosting.WindowsServices,然后在Program.cs使用UseWindowsService()即可,完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}).ConfigureLogging(logging =>
{
logging.ClearProviders(); //删除日志组件
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
}).UseNLog().UseWindowsService();
}

我们发布尝试一下。

1
dotnet publish -r win7-x64 -c release -o ./bin/output

发布完成后,我们有两种方式创建服务:

  • 基于Windows的SC

  • 基于PowerShell的New-Service

    基于Windows的SC创建Windows服务

    首先,我们熟悉一下sc的用法:

    1
    sc [ServerName] create Servicename [Optionname= Optionvalues]
  • [ServerName]可选,可以操作远程计算机。如果在本地计算机上操作就不用添加任何参数。

  • Servicename 注册的服务名称

  • Optionname & Optionvalues 注册服务时指定的参数名&参数值

    1
    2
    3
    4
    5
    6
    type=[own|share|interact|kernel|filesys] #关于建立服务的类型,默认是share。
    start=[boot|system|auto|demand|disabled] #关于启动服务的类型,默认是demand(手动)。
    error=[normal|severe|critical|ignore] #当服务在导入失败错误的严重性,默认是normal。
    binPath=[binary path] #服务二进制文件的路径名。
    displayname=[服务显示名称]
    password=[用户密码] #如果一个不同于localsys tem的账号使用时需要使用这个。

    sc 删除:

    1
    sc [ServerName] delete [ServiceName]

    sc start/stop

    1
    sc start/stop [ServiceName]

    SC创建服务

    我们现在就把我们刚才发布的二进制文件注册成Windows服务

    1
    2
     C:\Users\lenovo\source\repos\Swagger.Demo\Web\bin\output>sc create SwaggerDemo start=auto binpath="\"C:\Users\lenovo\source\repos\Swagger.Demo\Web\bin\output\Web.exe\"
    [SC] CreateService 成功

    现在我们就启动起来看看效果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     C:\Users\lenovo\source\repos\Swagger.Demo\Web\bin\output>sc start SwaggerDemo

    SERVICE_NAME: SwaggerDemo
    TYPE : 10 WIN32_OWN_PROCESS
    STATE : 2 START_PENDING
    (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
    WIN32_EXIT_CODE : 0 (0x0)
    SERVICE_EXIT_CODE : 0 (0x0)
    CHECKPOINT : 0x0
    WAIT_HINT : 0x7d0
    PID : 14428
    FLAGS :


    基于PowerShell New-Service创建服务

    语法格式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    New-Service
    [-Name] <String>
    [-BinaryPathName] <String>
    [-DisplayName <String>]
    [-Description <String>]
    [-SecurityDescriptorSddl <String>]
    [-StartupType <ServiceStartupType>]
    [-Credential <PSCredential>]
    [-DependsOn <String[]>]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]

    我们使用New-Service重新注册服务。

    1
    2
    3
    4
    5
    PS C:\Users\lenovo>  New-Service -Name SwaggerDemoByPowerShell -BinaryPathName C:\Users\lenovo\source\repos\Swagger.Demo\Web\bin\output\Web.exe -Description "SwaggerDemoByPowerShell" -DisplayName "SwaggerDemoByPowerShell" -StartupType Automatic

    Status Name DisplayName
    ------ ---- -----------
    Stopped SwaggerDemoByPo... SwaggerDemoByPowerShell


[参考]
https://www.cnblogs.com/inuex/p/4299690.html
https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-3.1&tabs=visual-studio

You forgot to set the qrcode for Alipay. Please set it in _config.yml.
You forgot to set the qrcode for Wechat. Please set it in _config.yml.
You forgot to set the business and currency_code for Paypal. Please set it in _config.yml.
You forgot to set the url Patreon. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×