在传统的宿主寄宿方式下,我们是打开一个控制台程序,并会出现控制台的界面,着实不好看,而且还不好自己自启动。 今天我们就来把asp.net core寄宿到windows服务中。
寄宿到windows服务中,微软提供了贴心的扩展包:Microsoft.AspNetCore.Hosting.WindowsServices
。我们先通过nuget
进行安装。
安装好后,只需要在程序启动的过程中调用扩展方法RunAsService
。这里要注意,RunAsService
的参数是IWebHost
类型,所以在构建host
的时候,要注意使用WebHost
。
具体实现如下:
//创建webhost
private static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost.CreateDefaultBuilder(args).UseUrls("http://0.0.0.0:5000").UseKestrel(opt =>
{
opt.Limits.MaxRequestBodySize = int.MaxValue;
}).UseStartup<Startup>();
}
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
bool isService = !(Debugger.IsAttached || args.Contains("--console"));
if (isService)
{
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
#pragma warning disable CA1416 // 验证平台兼容性
//以后台服务的方式运行
host.RunAsService();
#pragma warning restore CA1416 // 验证平台兼容性
}
else
{
host.Run();
}
}
else
{
host.Run();
}
}
程序构建好后,就可以通过cmd
命令进行安装了。
具体命令:sc create servername binpath= [your exe path] start= auto
。
这里要注意,cmd
需要以管理员权限运行。
安装好后,到这里我们就可以尝试启动服务了。
打开浏览器,我们会发现服务器返回500
的错误,表示服务器内部错误!!
可能原因是工作目录不正确,因为Windows服务的工作目录默认是在System32
下面,所以我们需要在host
构建之前设置当前的工作目录,代码如下所示:
public static void Main(string[] args)
{
//此处增加工作目录的设置,如果不做相关设置,那么服务将无法正常启动。
var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
var pathToContentRoot = Path.GetDirectoryName(pathToExe);
Directory.SetCurrentDirectory(pathToContentRoot);
//工作目录设置完成后再构建Host
var host = CreateWebHostBuilder(args).Build();
bool isService = !(Debugger.IsAttached || args.Contains("--console"));
if (isService)
{
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
#pragma warning disable CA1416 // 验证平台兼容性
//以后台服务的方式运行
host.RunAsService();
#pragma warning restore CA1416 // 验证平台兼容性
}
else
{
host.Run();
}
}
else
{
host.Run();
}
}
以上操作后,我们的站点就可以通过服务的方式运行了,只要电脑打开了,服务就自动运行了,也不会出现黑色的控制台界面了。
本文会经常更新,请阅读原文: https://huchengv5.gitee.io//post/asp.net-core-%E5%A6%82%E4%BD%95%E5%AF%84%E5%AE%BF%E5%88%B0Windows-Service%E6%9C%8D%E5%8A%A1.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名胡承(包含链接: https://huchengv5.gitee.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。