Ap.Net Core 作为服务(Windows Service)部署与SSL设置整理

前言

  为啥要使用win server服务器?

    我也不想,但我决定不了,我想大家都懂。

  为啥不用IIS部署?

    因为IIS部署的应用会休眠,就是说,应用程序TM自己去睡觉了,停止运行了......

  为啥要作为服务部署呢?

    自启动,一直运行,后台工作任务可以一直跑。

  为啥不直接写服务?

    这个应用程序定位就是作为WebApi,对外提供接口。

  那好,你用Docker啊!

    我也想,但我决定不了,我想大家都懂。

 

笔记 - 记录:

1.Ap.Net Core 作为服务(win service)部署

  微软官方文档 https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-7.0&tabs=visual-studio

   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设置

  微软官方文档 https://learn.microsoft.com/zh-cn/aspnet/core/security/enforcing-ssl?view=aspnetcore-7.0&tabs=visual-studio 

  说实话,不是微软文档不好,是我水平不够,看的时候云里雾里

  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一下

 

     踩的坑真多

 

posted @ 2022-11-20 19:24  youliCC  阅读(272)  评论(0编辑  收藏  举报