1. 程式人生 > >.NET 5學習筆記(11)—— Host Blazor WebAssembly in a Windows Service

.NET 5學習筆記(11)—— Host Blazor WebAssembly in a Windows Service

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