我們對ASP.NET Core的使用已經進行了相當一段時間了,大多數時候,我們的Web程式都是釋出到Linux主機上的,當然了,偶爾也有需求要釋出到Windows主機上,這樣問題就來了,難道直接以控制台形式運作這個Web程式嗎?
直接以控制台形式運作程式當然是可以的,但有以下問題:
- 需要敲指令行(這個可以通過制作一個快捷方式解決)
- 使用者也許會說有一個“黑黑的DOS視窗”,很奇怪
- 使用者可能會随手把這個“黑黑的DOS視窗”關掉導緻程式結束
- 不能夠自動地随系統啟動,得使用者登入後再跑程式
如果我們把程式以Windows服務的方式來運作,那以上這些問題都沒有了。
微軟官方有篇文章,關于如何做這個事情的:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-2.1
我也主要是參考了這篇文章,但其中還有些小小的坑,本文将會提到。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去,但依舊會出現問題:
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,這回沒問題了。
修改Main入口
簡單,非常簡單,把Run改為RunAsService即可。
但這樣會導緻新的問題,你在開發過程中調試程式的時候會出現這樣的錯誤: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方式。是以改成這樣:

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中指定特定身份。
來源:http://www.cnblogs.com/guogangj/p/9198031.html