web-dev-qa-db-ja.com

IHttpActionResultとIEnumerable <Item>とIQueryable <Item>を返す

ASP.NET Web API 2では、以下の違いは何ですか?

public async Task<IEnumerable<MyItem>> GetMyItems()
{
    //... code ..., var myItems = await ...
    return myItems;
}

そして

public async Task<IQueryable<MyItem>> GetMyItems()
{
    //... code ..., var myItems = await ...
    return myItems;
}

そして

public async Task<IHttpActionResult> GetMyItems()
{
    //... code ..., var myItems = await ...
    return Ok(myItems);
}

IHttpActionResultまたはIEnumerable<MyItem>/IQueryable<MyItem>

34
Adam Szabo

クライアントにより限定できるため、IHttpActionResultを返す必要があります。よりユーザーフレンドリーなWebアプリケーションを作成できます。基本的に、さまざまな状況に対してさまざまなHTMLステータスメッセージを返すことができます。

例えば:

public async Task<IHttpActionResult> GetMyItems()
{
    if(!authorized)
        return Unauthorized();
    if(myItems.Count == 0)
        return NotFound();
    //... code ..., var myItems = await ...
    return Ok(myItems);
}

IEnumerableand IQueryableはデータを出力形式に解析するだけで、例外を処理する適切な方法がありません。それが最も重要な違いです。

28
turhanco

私はIEnumerableとIHttpActionResultのどちらかを選択します。わずかに異なる方法で、これらの両方でほとんど同じことを実行できます。 IQueryableは通常、低レベルのデータアクセスタスクとSQLクエリの遅延実行に使用されるため、データアクセスクラス内にカプセル化して、Web APIで公開しないようにします。

これが http://www.asp.net/web-api/overview/web-api-routing-and-actions/action-results の要約です。

IHttpActionResult

IHttpActionResultインターフェースは、Web API 2で導入されました。本質的に、HttpResponseMessageファクトリを定義します。 IHttpActionResultインターフェイスを使用する利点(HttpResponseMessageクラスを超える)は次のとおりです。

  • コントローラーの単体テストを簡素化します。
  • HTTP応答を作成するための共通ロジックを個別のクラスに移動します。
  • 応答の作成に関する低レベルの詳細を非表示にすることにより、コントローラーアクションの意図をより明確にします。

IEnumerable <アイテム>

他のすべての戻り型の場合、Web APIはメディアフォーマッターを使用して戻り値をシリアル化します。 Web APIは、シリアル化された値を応答本文に書き込みます。応答ステータスコードは200(OK)です。

public class ProductsController : ApiController
{
    public IEnumerable<Product> Get()
    {
        return GetAllProductsFromDB();
    }
}

このアプローチの欠点は、404などのエラーコードを直接返すことができないことです。ただし、エラーコードに対してHttpResponseExceptionをスローできます。詳細については。

8
Jason