天天看點

以Windows服務方式運作ASP.NET Core程式

我們對ASP.NET Core的使用已經進行了相當一段時間了,大多數時候,我們的Web程式都是釋出到Linux主機上的,當然了,偶爾也有需求要釋出到Windows主機上,這樣問題就來了,難道直接以控制台形式運作這個Web程式嗎?

直接以控制台形式運作程式當然是可以的,但有以下問題:

  1. 需要敲指令行(這個可以通過制作一個快捷方式解決)
  2. 使用者也許會說有一個“黑黑的DOS視窗”,很奇怪
  3. 使用者可能會随手把這個“黑黑的DOS視窗”關掉導緻程式結束
  4. 不能夠自動地随系統啟動,得使用者登入後再跑程式

如果我們把程式以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方式。是以改成這樣:

以Windows服務方式運作ASP.NET Core程式
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();
    }      
以Windows服務方式運作ASP.NET Core程式

配置服務

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