陸續做出 ASP.NET MVC 版網站 CPU 與記憶體即時監看雛型及即插即用的元件化版本,依據當初的 Roadmap,下一步是移植到 ASP.NET Core。

心裡有數,現行做法有個天大障礙在於 Performance Counter 是血統純正的 Windows 功能,不屬於以跨平台為宗旨的 .NET Standard 規格範圍。然後有個重要觀念 - .NET Core 可以讓你寫出在 Windows、Linux、MacOS 都能跑的跨平台程式,但並非所有 .NET Core 程式都能跨平台。一個經典的例子便是 .NET Core 版 Windows Form 程式,.NET Core 從 3.x 起支援 Windows Form 桌面程式,你可以用 .NET Core 寫 WinForm,引用 .NET Core 專屬程式庫,但它只能在 Windows 平台跑,無法丟到 Linux/MacOS 執行。

移植計劃的第一階段目標我定義成「用最小工程將程式從 ASP.NET MVC 移到 ASP.NET Core Razor Page」。故我用第一篇文章的程式版本當雛型開始改寫,將 site.css、DS-DIGI.TTF、SelfMonitor.cs 原封不動搬到新建的 ASP.NET Core 專案。WebStatsConstroller.cs 的邏輯搬到 Pages/WebStatsMonitor/Index.cshtml.cs,原本的 HomeController.cs 產生 CPU 及記憶體負載的邏輯搬到 /Pages/Index.cshtml.cs,伺服端 Action 配合 Razor Page 規格小幅改寫成 OnPostActionName() 接收 AJAX 呼叫。MVC Views/Home/Index.cshtml、Views/WebStats/Index.cshtml 也搬到對應的 Razor Page Index.cshtml,配合 Razor Page 做法,AJAX URL 要做點小修改,加上 ?handler=ActionName 及 __RequestVerificationToken

接下來要解決 .NET Core 3.1 內建不支援 PerformanceCounter 的問題,有兩個 NuGet Package 可以解決這個問題:

System.Diagnostics.PerformanceCounter

或是 Microsoft.Windows.Compatiblity (Windows Compatibility Pack)

其中 System.Diagnostics.PerformanceCounter 支援清單出現 iOS、MAC 讓我小小期待了一下,以為它有做跨平台,但實驗證明,這兩個套件任擇其一都能讓程式順利編譯執行,但程式只能在 Windows 平台跑。如同 Windows Compatibility Pack 文件所說的:

The Windows Compatibility Pack is especially useful for customers that want to move .NET Core but plan to stay on Windows as a first step. In that scenario, not being able to use Windows-only technologies is only a migration hurdle with zero architectural benefit.

Windows Compatibility Pack 的目的僅在協助你完成第一步「讓從 .NET Framework 移植到 .NET Core 程式碼可以順利編譯並在 Windows 執行」,好過因為 Windows Only API 讓整個移植計劃卡死。成功轉移到 .NET Core,再設法改掉平台限定 API 升級成跨平台。

引用 Windows Compatibility Pack,我成功寫出 Windows-Only 的 ASP.NET Core 版本:

基於好奇,試著將程式搬到 Linux 上執行,網站可以運轉,但呼叫到使用 PerformaceCounter 程式時,不意外地出現 "Performance Coutners are not supported on this platform." 錯誤:

就這樣,我累積了一次 ASP.NET MVC 翻寫 ASP.NET Core 的經驗,學會遇到程式包含 Windows 專屬 API 的處置策略,收獲不少。

ASP.NET Core 版雛型我推上 Github 了,請參考 master 分支的 DemoWebCore.sln。

Experience of migrating my WebStatsMonitor from ASP.NET MVC to ASP.NET Core. Windows Compatibility Pack can ignore Windows-only API issue to help you completing the first step.


Comments

# by Dark200823

版主不好意思,一直以來都有一個疑問,那就是工作管理員的處理程序的記憶體使用總量不等於實體記憶體的使用總量,而且算起來的使用量差距蠻多的。有使用過Process Explorer、RamMap都無法藉由這些工具列舉的程序記憶體使用量加總,觀察這些程序與實體記憶體的佔用狀況。

# by Jeffrey

to Dark200823,我以前也有相同的疑問,https://blog.darkthread.net/blog/where-have-all-the-memory-gone/ <= 這篇應該可以解惑。

# by Dark200823

To Jeffrey 所以和Mapped File相似的記憶體空間是無法得知是什麼程序占用這些記憶體?

# by Jeffrey

to Dark200823,MappedFile、Metafile 為檔案快取,被 Windows 核心程序佔用,在記憶體不足時會還給一般程序使用。

Post a comment