Ap.Net Core 作为服务(Windows Service)部署与SSL设置整理
前言
为啥要使用win server服务器?
我也不想,但我决定不了,我想大家都懂。
为啥不用IIS部署?
因为IIS部署的应用会休眠,就是说,应用程序TM自己去睡觉了,停止运行了......
为啥要作为服务部署呢?
自启动,一直运行,后台工作任务可以一直跑。
为啥不直接写服务?
这个应用程序定位就是作为WebApi,对外提供接口。
那好,你用Docker啊!
我也想,但我决定不了,我想大家都懂。
笔记 - 记录:
1.Ap.Net Core 作为服务(win service)部署
a.应用程序修改
添加 Microsoft.Extensions.Hosting.WindowsServices 包
代码中使用 UseWindowsService()
WebApplicationOptions 参数设置
或者参考源文 https://stackoverflow.com/questions/70571849/host-asp-net-6-in-a-windows-service
b.创建服务
结合微软官网文档创建服务 https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-7.0&tabs=visual-studio
使用PowerShell命令如下:
New-Service -Name {SERVICE NAME} -BinaryPathName "{EXE FILE PATH} --contentRoot {EXE FOLDER PATH}" -Credential "{DOMAIN OR COMPUTER NAME\USER}" -Description "{DESCRIPTION}" -DisplayName "{DISPLAY NAME}" -StartupType Automatic
其中 -Credential "{DOMAIN OR COMPUTER NAME\USER}" 这个可以去掉,看情况 。我的理解是设置服务的权限,例如:管理员权限。
真实的命令如下,我按照微软给的PowerShell命令试了好久。字符串、大括号什么的,TM也不说什么该要,什么不该要:
New-Service -Name 发布生成的.exe文件不含.exe后缀 -BinaryPathName "D:\路径\发布生成的.exe文件含.exe --contentRoot D:\路径" -Description "Testing" -DisplayName "My Service" -StartupType Automatic
-Name -> 你发布的应用程序,其中包含一个.exe的文件, 这个就是这个 .exe 文件的名称,不含后缀 “.exe”
-BinaryPathName -> 程序的路径,包含这个 .exe 程序本身
--contentRoot -> 属于Asp.net core 中,程序运行的根路径
-Description -> 描述信息
-DisplayName -> 这个重要,这名称就是你在 “服务列表” 中看到的你程序的显示名称
-StartupType -> 例如:手动启动,自动启动等
其他几个关键命令:
启动服务
Start-Service -Name “服务名称”
删除服务
Remove-Service -Name “服务名称”,这个命令使用时,一直错(谁知道为什么?),我用另外一个代替了 ,如下:
sc.exe delete 服务程序名称(不含.exe),就是发布程序生成的那个 .exe 文件,不含“.exe”。
2.使用SSL设置
说实话,不是微软文档不好,是我水平不够,看的时候云里雾里
a. HttpsRedirection
使用 UseHttpsRedirection() 中间件 , 注册 AddHttpsRedirection 配置 ,如下图:
HttpsPort 这个参数很重要 , 表示 , 如果是“http”访问,则重定向到“Https”的端口 ,这个HttpsPort 就表示绑定的“https”的端口
b.UseHsts
我没有去验证这个中间件,按照微软文档上写的
c.本地安装一个开发用的https证书
直接参考“微软官方文档”,要踩很多坑
下面是操作步骤:
键盘 “windows 开始键” + R,然后输入 “ certmgr.msc ” 查看当前用户 ,输入 “ certlm.msc ” 查看本地凭证
查看证书的路径如下,删掉所有dotnet开发用的 localhost 的证书 , 防止对后面程序运行造成影响
如下图,不要把IIS Expresss的证书删了,不要把IIS Expresss的证书删了,不要把IIS Expresss的证书删了
PowerShell 中运行命令 dotnet dev-certs https -ep "D:\路径\名称.pfx" -p "密码" -t ,直接运行这个就行了,弹出的窗口,点击 trust
再执行 dotnet dev-certs https --trust ,这一步很重要
将 “名称.pfx” 复制到应用程序中,如下图:
右键->属性->复制到输出目录->选择始终复制
c.UseKestrel
配置内置的Kestrel服务,说简单点Kestrel就是用于监听某个端口,接收响应http请求。
如果不知道IPAddress怎么选看下图,UseHttps 第一个参数就是证书路径,第二个就是创建证书时,设置的 “-p” 密码参数
直接选 Loopback , 直接在浏览器中使用 https://localhost:端口/ 或者 https://127.0.0.1:端口/ 访问。
我这里设置的 IPAddress.Any
端口设置配置
设置好后,就可以访问了,F5 启动
这表示监听所有IP段,端口5033 ,至此SSL就设置好了
如果这里表示不是安全连接,那就重复上述 “C” 的操作,删除所有dotnet开发用 localhost 证书,重新生成新的证书 或者 是不是没执行 “ dotnet dev-certs https --trust ”
此测试项目源代码 https://github.com/qiqiqiyaya/Learning-Case/tree/main/AspNetCoreAsWindowsServiceTesting,觉得有帮忙的话,star一下
踩的坑真多
本文作者:youliCC