將ASP.NET核心應用程式作爲Windows服務運行

我們現在可以以最小的努力將ASP.NET Core應用程序作為Windows服務運行。這篇博客文章介紹了這個過程是如何完成的。

ASP.NET Core 2.1為Windows服務引入了一個新的應用程序主機。我們現在可以以最小的努力將ASP.NET Core應用程序作為Windows服務運行。這篇博客文章介紹了它是如何完成的以及如何在ASP.NET Core上構建和運行Windows服務,而不需要骯髒的黑客攻擊。

創建默認的Web應用程序

我們從新的默認ASP.NET Core 2.1 Web應用程序開始。

我沒有配置HTTPS,因為這是一個示例應用程序,它沒有任何重要意義。

默認情況下,這個 Program類看起來像這樣。

public class Program

{

public static void Main(string[] args)

{

CreateWebHostBuilder(args).Build().Run();

}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>

WebHost.CreateDefaultBuilder(args)

.UseStartup<startup>();/<startup>

}

現在我們有了默認的應用程序,現在是時候關注Windows服務了。

將ASP.NET核心應用程序作為Windows服務運行

將應用程序作為Windows服務運行需要一些努力,然後才能打開瀏覽器並在服務中查看它。首先,我們必須為我們的應用程序指定一個運行時,因為ASP.NET Core還支持Windows服務不運行的操作系統和體系結構。為此,我們必須修改項目文件。

<project>

<propertygroup>

<targetframework>netcoreapp2.1/<targetframework>

<runtimeidentifier>win7-x64/<runtimeidentifier>

<itemgroup>

<packagereference>

接下來,添加對NuGet包Microsoft.AspNetCore.Hosting.WindowsServices的引用。該軟件包具有運行ASP.NET Core應用程序作為Windows服務所需的所有功能。

NB!對我而言,Microsoft.AspNetCore.Hosting.WindowsServices的最新版本2.1.1與ASP.NET Core 2.1.0發生衝突,我改為使用2.1.0版。

我們也必須修改Main() 這個Program 類的 方法 。以最簡單的形式,該 Main() 方法看起來像這樣。

public static void Main(string[] args)

{

var pathToExe = Process.GetCurrentProcess().MainModule.FileName;

var pathToContentRoot = Path.GetDirectoryName(pathToExe);

var host = WebHost.CreateDefaultBuilder(args)

.UseContentRoot(pathToContentRoot)

.UseStartup<startup>()/<startup>

.Build();

host.RunAsService();

}

我們現在要做的就是發佈我們的應用程序,將其註冊為Windows服務並啟動服務。

將應用程序作為服務運行或在控制檯上運行

那些曾經構建過Windows服務的人非常清楚,在構建服務之後,必須部署新版本的服務,附加一個調試器等,服務的調試可能會成為特定解剖區域的痛苦。有簡單的解決方法 - 我們將Windows服務作為一個控制檯應用程序來運行,它很容易在Visual Studio的調試器上運行。

我們也可以將相同的技巧應用於作為Windows服務運行的ASP.NET Core應用程序。

public static void Main(string[] args)

{

var isService = !(Debugger.IsAttached || args.Contains("--console"));

var pathToContentRoot = Directory.GetCurrentDirectory();

var webHostArgs = args.Where(arg => arg != "--console").ToArray();

if (isService)

{

var pathToExe = Process.GetCurrentProcess().MainModule.FileName;

pathToContentRoot = Path.GetDirectoryName(pathToExe);

}

var host = WebHost.CreateDefaultBuilder(webHostArgs)

.UseContentRoot(pathToContentRoot)

.UseStartup<startup>()/<startup>

.Build();

if (isService)

{

host.RunAsService();

}

else

{

host.Run();

}

}

顯示的代碼可能看起來有點棘手。這裡是我的解釋:

要從Visual Studio在控制檯上運行應用程序,我們控制是否連接了調試器。如果我們想在Visual Studio之外將應用程序作為控制檯應用程序運行,那麼我們可以使用 -console參數。當應用程序作為Web服務器下的Web應用程序運行時,我們必須使用當前目錄作為內容根目錄。但是當應用程序作為服務運行時,我們需要一個可執行路徑作為內容根。我們刪除 -console 參數,因為ASP.NET Core期望所有參數都是名稱 - 值對。

現在嘗試從Visual Studio運行應用程序。它從一個普通的Web應用程序開始。

使應用程序作為Windows服務運行

為了使應用程序作為Windows服務運行,我們需要一些額外的步驟。

將應用程序發佈到某個文件夾。以管理權限打開命令行。使用t命令將應用程序註冊為Windows服務(“binPath =”為必填項後的空格) 。開始服務:sc start AspNetWindowsService。服務啟動後,打開瀏覽器並導航到http:// localhost:5000以查看運行的Web應用程序。

在發佈新版本的服務之前,必須停止當前運行的實例。為此,我們可以使用該命令 sc stop AspNetWindowsService。要刪除該服務,請運行以下命令: sc delete AspNetWindowsService。

結束

使用新的Microsoft.AspNetCore.Hosting.WindowsServices NuGet軟件包,可以輕鬆地將ASP.NET Core應用程序作為Windows服務運行。我們必須稍微修改一下項目文件並製作應用程序的 Main() 方法,以便了解應用程序作為服務或控制檯應用程序運行。使用這個技巧,我們能夠在Visual Studio上構建一個Web應用程序,並將其作為典型的Web應用程序運行。將Web應用程序作為Windows服務運行的負擔很小。