實在是被某軟忽悠瘸了,憤而寫此一篇。希望能讓同樣需求的同學們少走彎路。
某軟在《在 Windows 服務中托管 ASP.NET Core》中,介紹了通過創建Worker Service工程,來將.NET Core和.NET 5的程序以Windows Service的形式運行。但是某軟你得說明,托管ASP.NET Core Web Application,並不需要額外創建一個Worker Service工程啊,再加上GitHub上兩個放在一塊的sample project,直接把我誤導瘸了……
今天我就要記錄一下這個事情,其實是多么的簡單,控訴某軟文檔不走心。
接下來讓我們實踐一把。根據劇情需要,這里應該是一個Blazor WebAssembly App。
記得勾選ASP.NET Core hosted,會為我們額外創建一個用於Host的ASP.NET Core Web Application。如果不新建Web Application,同時也沒有可用的Web Application,單一的Blazor WebAssembly App是沒有辦法使用Windows Service托管的。
Create按鈕點擊下去,只見Visual Studio一通操作,建了三個工程。我們穩住不要慌,按F5運行,現在的情況是下圖這個樣子。左邊是我們新建的Blazor App在瀏覽器里跑起來的樣子。右側的Solution Explorer中,BlazorHostInWinService.Client是程序的主體,所有的Page都在這里畫。BlazorHostInWinService.Server是一個簡單的WebApi工程,其中的WeatherForecastController提供了給Blazor Fetch Data頁面測試用的天氣數據。至於最下面的Shared工程,可以理解為Client和Server之間傳遞數據,共享所使用的DTO對象,在該示例中,僅有一個Class WeatherForecast。
當前我們的程序是通過IIS Express來運行的,接着我們要把該工程通過Windows Service來托管運行。首先需要給BlazorHostInWinService.Server工程添加NuGet包 Microsoft.AspNetCore.Hosting.WindowsServices。再打開Program.cs文件,為IHostBuilder對象添加對UseWindowsService方法的調用。
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
額,好像也沒有其他事情可以做了,讓我們publish該項目。依然是選擇BlazorHostInWindowsService.Server工程,右鍵菜單中的publish點擊后,出現如下界面,選擇Folder后點擊Finish。
在如下圖的界面中,再一次開心的點擊publish。編譯過程中我們可以摸會魚,直到在Output窗口中出現迷人的信息:
========== Build: 3 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
========== Publish: 1 succeeded, 0 failed, 0 skipped ==========
然后讓我們打開Target location,即bin\Release\net5.0\publish\。把所有的文件都拷貝到我們希望部署的位置,比如C:\Users\xingzheng\Documents\BlazorWinService文件夾。
最后就是創建Windows Service了,我們打開具有admin權限的CMD窗口。鍵入
sc create FirstBlazorAppService binPath="C:\Users\dell\Documents\BlazorWinService\BlazorInWinServiceTest1.Server.exe"
此時我們打開Windows Services的界面,啟動FirstBlazorAppService即可。再返回到瀏覽器輸入http://localhost:5000
標題是我在Index.razor文件中手動改的,也為了區別之前通過IIS Express運行的頁面。
本篇就到這里,簡單地介紹了如何將Blazor App通過Windows Service托管。
GitHub:
https://github.com/manupstairs/BlazorHostInWinService