咱們對ASP.NET Core的使用已經進行了至關一段時間了,大多數時候,咱們的Web程序都是發佈到Linux主機上的,固然了,偶爾也有需求要發佈到Windows主機上,這樣問題就來了,難道直接以控制檯形式運行這個Web程序嗎?windows
直接以控制檯形式運行程序固然是能夠的,但有如下問題:工具
若是咱們把程序以Windows服務的方式來運行,那以上這些問題都沒有了。ui
微軟官方有篇文章,關於如何作這個事情的:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-2.1spa
我也主要是參考了這篇文章,但其中還有些小小的坑,本文將會提到。OK,Let's get down to work.命令行
生成目標固然選擇最新的.NET Core 2.1了,包則須要引入Microsoft.AspNetCore.Hosting.WindowsServices,最新版是2.1.1(2018/6/19更新,不就是今天嘛),若是你嘗試使用最新的2.1.1版,那會出問題,報依賴衝突,你根據報錯內容把ASP.NET 2.1.0升級到ASP.NET 2.1.1去,但依舊會出現問題:debug
It was not possible to find any compatible framework version
The specified framework 'Microsoft.AspNetCore.All', version '2.1.1' was not found.調試
看來須要安裝新的SDK才行,但微軟官網最新的正式版SDK就是2.1.300啊,這個仍是等等吧,好,果斷把版本降回2.1.0,這回沒問題了。code
簡單,很是簡單,把Run改成RunAsService便可。blog
但這樣會致使新的問題,你在開發過程當中調試程序的時候會出現這樣的錯誤:Cannot start service from the command line or a debugger. A Windows Service must first be installed and then started with the ServerExplorer, Windows Services Administrative tool or the NET START command. 程序跑不起來,意思顯而易見,因此咱們在調試中仍是要以普通的Run方式。因此改爲這樣:ci
IWebHost host = WebHost.CreateDefaultBuilder(args) .UseKestrel(options => { options.Listen(IPAddress.Any, 5201); }) //5201是我用的端口,你改爲本身的 .UseStartup<Startup>() //使用Startup配置類 .Build(); bool isService = !(Debugger.IsAttached || args.Contains("--console")); //Debug狀態或者程序參數中帶有--console都表示普通運行方式而不是Windows服務運行方式 if (isService) { host.RunAsService(); } else { host.Run(); }
ASP.NET Core publish生成的目標中並不包含exe文件,因此按照官網文檔去弄的話可能會卡住,這是正確的姿式:
sc create MyService binPath= "\"C:\program files\dotnet\dotnet.exe\" \"D:\Services\MyService.dll\"" DisplayName= "MyService" start= auto
注意1:必須以管理員身份運行上面命令
注意2:binPath參數、DisplayName參數及start參數的等號後面必須帶一個空格(官網文檔也特別提起了這點)
啓動服務:
sc run MyService
中止服務:
sc stop MyService
卸載服務:
sc delete MyService
默認狀況下,Windows系統服務是以system用戶身份運行的,若是你須要切換身份運行,能夠在「控制面板 - 管理工具 - 服務」中找到MyService,打開屬性面板,在「登陸」Tab中指定特定身份。