首先我现在的项目是一个基于.Net Core 3.1 的 WebApi 项目
考虑使用Windows 服务托管的原因有下:
1.如果在控制台启动, 会一直有个控制台在屏幕, 个人不喜欢
2.可以通过命令来启动,停止, 在使用Jenkins部署时会方便很多
实现
看了很多资料之后,发现这个事情还是比较简单的,不过在我这个事情的时候遇到了一个"很不应该"的坑, 所以,写个文章记录一下, 加深一下记忆.
首先需要在项目中添加一个Nuget包,如下:
Microsoft.Extensions.Hosting.WindowsServices
然后在项目的入口中添加一下代码: IHostBuilder.UseWindowsService();
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.......
......
.UseWindowsService();
然后打开Powershell
使用一下命令创建Windows 服务;
// 创建服务
sc create <servicename> binPath= '<exe path>'
// <exe path> 项目编译之后,在编译目录会有一个对应的exe文件
// 启动服务
sc start <servicename>
// 停止服务
sc stop <servicename>
// 删除服务
sc delete <servicename>
至于 sc 是什么,更详细的使用方式,这里不做过多的赘述
正常来说 到这里就已经OK了,但是我在这里遇到一个坑.
这里有一句很重要的话
请勿尝试使用 GetCurrentDirectory 来获取资源路径,因为 Windows 服务应用会返回“C:\WINDOWS\system32”文件夹作为其当前目录。
因为我在项目中使用了swagger,然后swagger的IncludeXmlComments我是用 CurrentDirectory 来处理的,
因此在服务启动之后一直报 500:
这里我们将 XML文档文件复制一份到 "C:\WINDOWS\system32" 目录下,就可以了,
我是将xml文件的路径配置到 appsettings 中处理的.
"XmlDocumentationPath": "C:/nginx/website/copper/Copper.WebService.Web.xml",
options.IncludeXmlComments(Configuration["XmlDocumentationPath"]);
另外这里有个小技巧,被我忽略了,耽误了我很多的时间;
app.UseDeveloperExceptionPage();
就是这个玩意.
有啥问题, 先把这个放出来, 可能会有意想不到的效果 . . . . .