我們現在可以以最小的努力將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服務運行的負擔很小。