如何在 .NET Core WebApi 中處理 MultipartFormDataContent

hippieZhou發表於2023-04-19

最近在對某個後端服務做 .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 中,所以我們只需要透過這個物件來拿我們想要的資料即可。(PS:如果從 Request.Form 中獲取 Files,這個地方會有一個坑,下文會講到。)

相關文章