在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>
?
答案 0 :(得分:26)
您应该返回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
和IQueryable
只会将您的数据解析为输出格式,您将无法正确处理异常。这是最重要的区别。
答案 1 :(得分:8)
我会在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&LT;项目&GT; 强>
对于所有其他返回类型,Web API使用媒体格式化程序来序列化返回值。 Web API将序列化值写入响应主体。响应状态代码为200(OK)。
public class ProductsController : ApiController
{
public IEnumerable<Product> Get()
{
return GetAllProductsFromDB();
}
}
此方法的缺点是您无法直接返回错误代码,例如404.但是,您可以为错误代码抛出HttpResponseException。有关更多信息。