日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

客户要求ASP.NET Core API返回特定格式,怎么办?(续2)

發布時間:2023/12/4 asp.net 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 客户要求ASP.NET Core API返回特定格式,怎么办?(续2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

前2次,我們都是假設客戶需要返回不同的字符串格式。

但是,有可能客戶要求的返回是非本文格式,比如文件流。

怎么辦?

思路

前提,當然還是使用同一API接口,不影響現有使用方式。

雖然ASP.NET Core Web API默認使用SystemTextJsonOutputFormatter格式化響應,但是OutputFormatters集合里其實包含了StreamOutputFormatter。

那么實現目標就轉化為,怎么讓Web API使用StreamOutputFormatter?

DefaultOutputFormatterSelector

通過查看dotnet/aspnetcore源代碼,我們找到了DefaultOutputFormatterSelector,它是選擇IOutputFormatter以寫入對當前請求的響應的默認實現:

其中,選擇IOutputFormatter具體實現是通過判斷CanWriteResult方法,代碼如下:

foreach?(var?formatter?in?formatters) {formatterContext.ContentType?=?new?StringSegment();formatterContext.ContentTypeIsServerDefined?=?false;if?(formatter.CanWriteResult(formatterContext)){return?formatter;} }

而StreamOutputFormatter是這樣實現CanWriteResult方法的:

public?bool?CanWriteResult(OutputFormatterCanWriteContext?context) {if?(context?==?null){throw?new?ArgumentNullException(nameof(context));}//?Ignore?the?passed?in?content?type,?if?the?object?is?a?Stream.if?(context.Object?is?Stream){return?true;}return?false; }

那么實現目標就轉化為,怎么讓Web API返回的是Stream?

操作返回類型

微軟官方文檔ASP.NET Core Web API 中控制器操作的返回類型[1]提到,返回類型除了支持特定類型之外,還支持ActionResult<T>。

ActionResult<T>可以返回從ActionResult派生的類型或返回特定類型:

那么實現目標就轉化為,將返回類型設為ActionResult<T>,根據條件返回T,或者返回特定ActionResult派生類,例如FileResult。

實現

具體實現代碼如下,如果Accept Header是text/json則返回文件流:

[HttpGet] public?ActionResult<IEnumerable<WeatherForecast>>?Get() {var?rng?=?new?Random();var?result?=?Enumerable.Range(1,?5).Select(index?=>?new?WeatherForecast{Date?=?DateTime.Now.AddDays(index),TemperatureC?=?rng.Next(-20,?55),Summary?=?Summaries[rng.Next(Summaries.Length)]}).ToArray();HttpContext.Request.Headers.TryGetValue("Accept",?out?var?acceptValue);if?(acceptValue.ToString()?==?"text/json"){using?(var?memory?=?new?MemoryStream()){using?(var?writer?=?new?StreamWriter(memory)){writer.Write(System.Text.Json.JsonSerializer.Serialize(result));writer.Flush();}return?File(memory.ToArray(),?"text/json",?"WeatherForecast.json");}?}return?result; }

結論

現在,只需要客戶在每個API請求加上Accept Header即可滿足需求。

如果你覺得這篇文章對你有所啟發,請關注我的個人公眾號”My IO“

參考資料

[1]

ASP.NET Core Web API 中控制器操作的返回類型: https://docs.microsoft.com/zh-cn/aspnet/core/web-api/action-return-types?view=aspnetcore-5.0

總結

以上是生活随笔為你收集整理的客户要求ASP.NET Core API返回特定格式,怎么办?(续2)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。