如何在 .NET Core WebApi 中處理 MultipartFormDataContent

最近在對某個後端服務做 .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,這個地方會有一個坑,下文會講到。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章