Microsoft Teams 的 .NET Core 旅程
Microsoft Teams \「MiddleTier\」 是一項內部服務,可在 Microsoft Teams 中提供各種案例。這是由 700 個以上 API 組成的最大服務之一,由 10 個以上的團隊在 Microsoft 維護。在過去兩年,此服務下 50 個以上的專案 (程式庫、測試、應用程式) 已轉換為 .NET Standard 2.0 和 .NET Core 3.1,其功能和效能均表現一樣好 (或更佳),而且現在幾乎完全在 .NET Core 3.1 生產環境中執行,並期待接下來會移至 .NET 6。在此移轉之前,服務是使用 ASP.NET Core 2.2 MVC 管線在 .NET Framework 4.6.2 上執行。它在 Azure Service Fabric 上執行,部署在 35 個 Azure 資料中心。
此遷移的範圍很大,因為就每天為數百名使用的開發人員提供的功能而言,MiddleTier 是一項超大型服務。
移轉的動機
由於下列原因,小組已積極移至 .NET Core 3.1:
- 效能與成本效率改善
- .NET Framework 4.6.2 可能即將過期
- 跨平台支援
- 移至新式架構以獲得更佳的開發人員體驗
移轉至 .NET Core 3.1 後的權益
移轉至 .NET Core 3.1 之後,小組已注意到下列改善:
- CPU 改善 25%
- 降低大約 25% 的基礎結構成本
- 改善的執行緒集區使用量
- 減少技術債務,並努力移至年度 .NET 版本
下列圖表顯示 .NET Framework 與 .NET Core 之間的比較。未來使用 .NET 6 時,我們應看到更進一步的改善。
方法
整體移轉分為三個階段:
他們也會選擇將應用程式多目標鎖定至 .NET Framework 和 .NET Core,這樣兩個二進位檔案都可以使用,而且可以繼續緩慢地推出 .NET Core。
Learnings
OData 與其他 REST API 無法共用路由首碼
他們的服務有少數 OData 端點,以及許多 REST 端點。這兩個共用相同的端點路由首碼。這原本在.NET Framework 中正常運作,但因為路由變更,這已停止在 .NET Core 中運作。他們必須將 OData API 移至不同的路由首碼以解決此問題。
OData 用戶端程式庫的效能問題
HttpWebRequest 模仿 OData 用戶端以呼叫下游 OData API,結果比 .NET Framework 產生較高的延遲。這是因為 .NET Core 的迴歸,其中架構未快取連線。這已在較新版本的 .NET 中解決。
Azure 服務匯流排 SDK 的問題
Azure 服務匯流排 SDK 必須在此移轉中升級,因為舊版本與 .NET Standard 不相容。最新版的Azure 服務匯流排 SDK以 JSON 格式傳送要求承載,但較舊的 SDK以 XML 格式傳送承載。若要繼續使用 XML 承載,他們必須使用DataContractSerializer。
多重目標 Service Fabric 專案中的問題
Service Fabric Project (sfproj) 本身並不支援多重目標。它們必須執行組建管線中的因應措施,才能為兩個目標架構產生 Service Fabric 套件。
舊版 MimeKit NuGet 發生問題
舊版的 MimeKit可能有雙位元組字元的問題,因此在此案例中建議進行語言特定驗證。當他們推出至位於亞洲地理位置的部署時,發現類似的問題。
經典 ASP.NET 怪癖
- 必須移除在 .NET Core 中標示為內部的部分 .NET Framework 類別的使用方式。
- 如《ASP.NET Core 3.0 和3.1 版的重大變更》一文所述,已從動作名稱中刪除 MVC 非同步尾碼。如果任何程式碼路徑依賴動作名稱,則可能導致行為變更。
- 根據預設,從 .NET Core 3.0 開始的所有伺服器上,會依預設關閉同步 IO 作業,如dotnet/aspnetcore#7644 GitHub 問題中所述。
- 將 StreamContent 傳送為 HTTP 要求內容時,Content.Headers 中未設定 Content-Length 標頭。這可能會導致下游呼叫發生錯誤。
- .NET Framework 會為字串產生穩定雜湊碼,但 .NET Core 卻不能。
- System.ComponentModel.DataAnnotations 命名空間的必要屬性在 .NET Core 中的行為不同。在 .NET Framework 上,此屬性不會對非 Null 欄位執行任何模型驗證,但在 .NET Core 上則會執行。
未來
每個新版本的 .NET 皆提供極佳的生產力和效能改進,可持續協助實現我們建置彈性、可調整、高效能和安全服務的目標。團隊下一步將透過升級到 .NET 6 來繼續利用 .NET 中所做的改進。
準備開始了嗎?
我們的逐步教學課程可協助您讓 ASP.NET 在電腦上執行。