.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
13
 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

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

https://blogs.52fx.biz/posts/1795956873.html

作者

eyiadmin

发布于

2020-01-12

更新于

2024-05-31

许可协议

评论