最近在對某個後端服務做 .NET Core 升級時,裡面使用了多處處理 MultipartFormDataContent 相關內容的代碼。這些地方從 .NET Framework 遷移到 .NET Core 之後的代碼改動較大,由於本身沒有測試覆蓋,導致在部署 QA 環境後引發了一些問題。這裡做一個 ...
最近在對某個後端服務做 .NET Core 升級時,裡面使用了多處處理 MultipartFormDataContent 相關內容的代碼。這些地方從 .NET Framework 遷移到 .NET Core 之後的代碼改動較大,由於本身沒有測試覆蓋,導致在部署 QA 環境後引發了一些問題。這裡做一個技術復盤。
什麼是 MultipartFormDataContent
我們在做後端介面開發的時候,常常會涉及到介面參數為多種類型的情況,比如值類型,引用類型,或者是文件類型。如果我們需要在一個介面參數中同時傳遞多種不多的數據類型,那麼這個時候就需要用到 multipart/form-data MIME 類型進行內容編碼,然後傳遞給後端。比如我們需要往後端介面傳遞一個同時包含文件和字元串文本的話,使用 Postman 你可以這樣構造內容:
對應的 HTTP 請求內容則類似是這樣:
MultipartFormDataContent 的寫操作
在 C# 中,我們通常會使用 HttpClient 這個類型的實例對象來進行介面請求,對應實例代碼如下所示:
在這個請求構造中,我們嘗試在記憶體中創建一個壓縮文件 test.zip,然後再構造一個簡單的文本內容,並將這兩部分內容統一放到Body 中通過 HttpClient 發送到後端。
MultipartFormDataContent 的讀操作
.NET Framework
在傳統 Framework 項目中,我們可以通過構造出 MultipartMemoryStreamProvider 類型來方便解析接收到的 MultipartFormDataContent 對象,但是由於這個類型在 .NET Core 中已經被不存在,所以我們需要嘗試新的方法來重構這一塊的代碼。
.NET Core
方式一
由於接收到的 MultipartFormDataContent 對象內部是由多個 Section 所組成,所以我們可以通過迴圈每個 Section 的方式來分別解析所有內容。
⚠️ 這種讀取方式較複雜,並且從目前已經使用過這種方式的服務來講的話,建議要有對應的測試覆蓋。
方式二
這種方式是通過藉助 ASP.NET Core 本身的框架封裝,將原本複雜的 MultipartFormDataContent 直接放到 Request.Form 中,所以我們只需要通過這個對象來拿我們想要的數據即可。