.NET 6學習筆記(3)——在Windows Service中託管ASP.NET Core並指定埠

樓上那個蜀黍發表於2022-03-31

在上一篇《.NET 6學習筆記(2)——通過Worker Service建立Windows Service》中,我們討論了.NET Core 3.1或更新版本如何建立Windows Service。本篇我們將在此基礎上,託管ASP.NET Core程式並指定埠。
首先讓我們建立一個ASP.NET Core Web App,當然Web Api型別也是可以的。通過NuGet來安裝Microsoft.Extensions.Hosting.WindowsServices。該庫提供了必要的UseWindowsSrvice方法。

讓我們對Program.cs檔案稍作修改。在InWindowsSerivice的狀態下,將ContentRootPath設定為AppContext.BaseDirectory。這是因為從Windows Service中呼叫GetCurrentDirectory會返回C:\WINDOWS\system32,所以某軟需要我們將ContentRootPath指定到WebApp的exe所在目錄。還有不要忘了在builder的Host屬性上呼叫UseWindowsService方法。

UseWindowsService方法。
using Microsoft.Extensions.Hosting.WindowsServices;

var options = new WebApplicationOptions
{
    Args = args,
    ContentRootPath = WindowsServiceHelpers.IsWindowsService() ? AppContext.BaseDirectory : default
};

var builder = WebApplication.CreateBuilder(options);

// Add services to the container.
builder.Services.AddRazorPages();

builder.Host.UseWindowsService();

var app = builder.Build();

完成上述步驟之後,我們已經可以通過PowerShell來建立Windows Service了。但是預設情況下ASP.NET Core被繫結到http://localhost:5000。這可能不符合我們的期望。那如何修改呢?比較簡單的方式是增加appsettings.Production.json檔案,新增僅針對釋出後程式的配置。好處是不會影響Visual Studio中的Debug,如果我們在程式碼中通過UseUrls方法,或者修改launchSettings.json檔案,會導致Debug時不會自動啟動WebBrowser的奇怪問題。

本篇我們討論瞭如何在Windows Service託管ASP.NET Core程式並指定埠。水平有限,還請各位大佬扶正。

Github:
manupstairs/WebAppHostOnWinService (github.com)
Gitee:
manupstairs/WebAppHostOnWinService (gitee.com)

 

相關文章