2016-09-01 31 views
3

は、ASP.NETコアウェブAPIコントローラ方法については、以下のメソッドのシグネチャを考えてみましょう:デフォルトの設定では"JsonResult/IActionResult"または "Task <SomeObject>"またはAsp.net Core Web APIの "SomeObject"を返す違いは何ですか?

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

を、すべてのクライアントにSomeObjectのJSON表現を返します。フレームワークはそれらを別々に扱いますか?もしそうなら、いつ使用すべきですか?

たとえば、多くのドキュメントでは、OK()などのヘルパ関数によって生成されたIActionResultの実装の使用を推奨しています。しかし、これらのすべてがStatusCodeに設定されているように見えますが、メソッドが返すものを難読化するという欠点があります。実際、さまざまな状況で異なるタイプを返す可能性がありますが、これはひどい考えです。ノックオン効果は、Swaggerのようなツールは、メソッドが返すものを予測できないということです。

だから私はSomeObjectを返すために好む:

  1. 私は重要な何かをしないのですか?、
  2. Task<SomeObject>を返すことの利点は何ですか - それは便利常にある、またはメソッドが非同期使用している場合にのみ電話?

編集:明確にする試み - すべてのシグネチャがクライアントにSomeObjectのJSON表現を返しますが、ビューのC#の観点から、彼らは別の戻り値の型を持っているので、MVCフレームワークは、それらを変換するために、いくつかの仕事をしています。

これはベストプラクティスであり、なぜですか? SomeObjectを返すのではなく、JsonResultを返す理由がありますか?戻り値Task<SomeObject>は常に使用する必要がありますか、またはアクションに非同期コードが含まれている場合は、それは貴重です(私は仮定します)。

+0

非同期メソッドはTask'非同期'前に付加されている; ' あなたが求めている何するJsonResultとSomeObjectの違いがある何ですか? 1つはプロパティを持つオブジェクトを返します。もう一方はJson形式を返します。 – firste

答えて

2

ASP.NETコアでformattersとは何が検索され、どのように動作していますか?公式ドキュメントから:

特定の型を返す必要はありません。 MVCは任意のオブジェクト戻り値をサポートします。アクションがIActionResult実装を返し、コントローラがControllerから継承する場合、開発者は多くの選択肢に対応する多くのヘルパメソッドを持っています。 IActionResult型ではないオブジェクトを返すアクションの結果は、適切なIOutputFormatter実装を使用してシリアル化されます。

また、およそContent Negotiationを読んでする必要があります。

Acceptヘッダーがリクエストに表示されている場合、コンテンツネゴシエーションのみ行われます。要求に受け入れヘッダが含まれている場合、フレームワークはacceptヘッダのメディアタイプを優先順位順に列挙し、acceptヘッダーで指定されたフォーマットのいずれかで応答を生成できるフォーマッタを見つけようとします。クライアントの要求を満たすことができるフォーマッタが見つからない場合、フレームワークは応答を生成できる最初のフォーマッタを見つけようとします(ただし、開発者がMvcOptionsのオプションを406 Not Acceptableに設定している場合を除く)。JsonResultの範囲内

、最後に使用した:

アクションは、常に特定の方法でフォーマットされている具体的な結果を返すことができます。たとえば、JsonResultを返すと、クライアントの設定に関係なく、JSON形式のデータが返されます。

続きを読むFormatting Response Dataセクションを参照してください。あなたがタスク GetById(文字列ID)非同期パブリックメソッドを `持つことができるように

+0

ありがとうございます、私は実際にこれらのすべてを読んで理解しています。私は私の質問を明確にしますが、本質的にはこれです:これらのすべての署名は 'SomeObject'のJSON表現をクライアントに返します。明らかに、MVCフレームワークは、それを達成するためのボンネットの下で動作しています。どちらかを選ぶべき理由は何ですか?それとも重要ではありませんか? – Peter

+1

それはあなたがクライアントとして応答として提供したいものに依存します。クライアントは常にJSON形式でのみ結果が必要ですか、またはコンテンツネゴシエーションをサポートし、提供されたAcceptヘッダーに応じて異なる形式でデータを返したいとしますか?簡単な例として、JsonResultを使用すると、クライアントはXML形式や他のJSON形式で結果を取得することはできません。 – Set

関連する問題