在传统的宿主寄宿方式下,我们是打开一个控制台程序,并会出现控制台的界面,着实不好看,而且还不好自己自启动。 今天我们就来把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/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系