實在是被某軟忽悠瘸了,憤而寫此一篇。希望能讓同樣需求的同學們少走彎路。
某軟在《在 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