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>
?
クライアントにより限定できるため、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);
}
IEnumerable
and IQueryable
はデータを出力形式に解析するだけで、例外を処理する適切な方法がありません。それが最も重要な違いです。
私は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クラスを超える)は次のとおりです。
IEnumerable <アイテム>
他のすべての戻り型の場合、Web APIはメディアフォーマッターを使用して戻り値をシリアル化します。 Web APIは、シリアル化された値を応答本文に書き込みます。応答ステータスコードは200(OK)です。
public class ProductsController : ApiController
{
public IEnumerable<Product> Get()
{
return GetAllProductsFromDB();
}
}
このアプローチの欠点は、404などのエラーコードを直接返すことができないことです。ただし、エラーコードに対してHttpResponseExceptionをスローできます。詳細については。