簡體   English   中英

返回“JsonResult / IActionResult”或“Task”有什么不同 <SomeObject> “或者只是Asp.net Core Web API中的”SomeObject“?

[英]What is the difference in returning “JsonResult/IActionResult” or “Task<SomeObject>” or just “SomeObject” in a Asp.net Core Web API?

請考慮ASP.NET Core Web API控制器方法的以下方法簽名:

public JsonResult GetById(string id);
public async Task<SomeObject> GetById(string id);
public SomeObject GetById(string id)

在默認設置中,all都將SomeObject的JSON表示返回給客戶端。 框架是否以不同方式對待它們?如果是,那么何時應該使用它?

例如,大多數文檔建議使用由輔助函數(如OK()生成的IActionResult實現。 然而,所有這些似乎為你做的是設置StatusCode,並且它們具有混淆你的方法返回的內容的缺點 - 實際上你可以在不同的情況下返回不同的類型,我認為這是一個可怕的想法。 連鎖效應是像Swagger這樣的工具無法預測該方法將返回什么。

所以我更願意返回SomeObject

  1. 我錯過了一些重要的東西嗎?
  2. 返回Task<SomeObject>有什么好處 - 它總是有用,還是僅當方法使用異步調用時?

編輯:嘗試澄清 - 所有簽名都將SomeObject的JSON表示返回給客戶端,但是從C#的角度來看,它們具有不同的返回類型,因此MVC框架正在做一些轉換它們的工作。

哪個是最佳做法,為什么? 有沒有理由返回JsonResult而不是返回SomeObject 是否應該總是使用返回的Task<SomeObject> ,或者它是否有價值(我假設)如果操作中有異步代碼?

您在搜索什么是ASP.NET Core中的formatters以及它們的工作原理。 從官方文件:

返回任何特定類型不需要操作; MVC支持任何對象返回值。 如果一個動作返回一個IActionResult實現並且控制器繼承自Controller,那么開發人員有許多與許多選擇相對應的輔助方法。 返回非IActionResult類型對象的操作的結果將使用適當的IOutputFormatter實現進行序列化。

您還需要閱讀有關Content Negotiation

只有在請求中出現Accept標頭時才會進行內容協商。 當請求包含accept頭時,框架將按優先順序枚舉accept頭中的媒體類型,並嘗試查找可以使用accept頭指定的格式之一生成響應的格式化程序。 如果沒有找到可以滿足客戶端請求的格式化程序,框架將嘗試找到可以產生響應的第一個格式化程序(除非開發人員在MvcOptions上配置了選項以返回406 Not Acceptable)。

最后在JsonResult范圍內使用:

操作可以返回始終以特定方式格式化的特定結果。 例如,無論客戶端首選項如何,返回JsonResult都將返回JSON格式的數據。

閱讀格式化響應數據部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM