C# 返回IHttpActionResult vs IEnumerable<;项目>;vs IQueryable<;项目>;
在ASP.NET Web API 2中,以下各项之间的区别是什么C# 返回IHttpActionResult vs IEnumerable<;项目>;vs IQueryable<;项目>;,c#,asp.net,asp.net-web-api,async-await,asp.net-web-api2,C#,Asp.net,Asp.net Web Api,Async Await,Asp.net Web Api2,在ASP.NET Web API 2中,以下各项之间的区别是什么 public async Task<IEnumerable<MyItem>> GetMyItems() { //... code ..., var myItems = await ... return myItems; } public异步任务GetMyItems() { //…代码…,var myItems=wait。。。 归还我的物品; } 及 public异步任务GetMyItem
public async Task<IEnumerable<MyItem>> GetMyItems()
{
//... code ..., var myItems = await ...
return myItems;
}
public异步任务GetMyItems()
{
//…代码…,var myItems=wait。。。
归还我的物品;
}
及
public异步任务GetMyItems()
{
//…代码…,var myItems=wait。。。
归还我的物品;
}
及
public异步任务GetMyItems()
{
//…代码…,var myItems=wait。。。
返回Ok(myItems);
}
如果我返回
IHttpActionResult
或IEnumerable
/IQueryable
?我会在IEnumerable和IHttpActionResult之间进行选择,您可以用稍微不同的方式对这两种方法执行几乎相同的操作。IQueryable通常用于较低级别的数据访问任务和sql查询的延迟执行,因此我将它封装在数据访问类中,而不是使用web api公开它
以下是来自以下方面的总结:
IHttpActionResult
IHttpActionResult接口是在Web API 2中引入的。本质上,它定义了一个HttpResponseMessage工厂。以下是使用IHttpActionResult接口(相对于HttpResponseMessage类)的一些优点:
- 简化控制器的单元测试
- 将用于创建HTTP响应的公共逻辑移动到单独的类中
- 通过隐藏构造响应的低级细节,使控制器操作的意图更加清晰
公共类产品控制器:ApiController
{
公共IEnumerable Get()
{
返回GetAllProductsFromDB();
}
}
这种方法的缺点是不能直接返回错误代码,例如404。但是,您可以为错误代码抛出HttpResponseException。有关详细信息。您应该返回
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);
}
public异步任务GetMyItems()
{
如果(!授权)
未经授权返回();
如果(myItems.Count==0)
返回NotFound();
//…代码…,var myItems=wait。。。
返回Ok(myItems);
}
IEnumerable
和IQueryable
只会将您的数据解析为输出格式,您将无法正确处理异常。这是最重要的区别。-1“IQueryable通常用于较低级别的数据访问任务和sql查询的延迟执行,因此我将它封装在数据访问类中,而不是用web api公开它。”这是完全错误的。如果不公开IQueryable,就很难使用OData
查询URL@Aron我同意这不适用于OData,但是很多人不同意您在存储库层之外公开IQueryable:。有些人甚至将OData本身描述为反模式+1。我正在寻找实现ODataURL的方法,您的回答引导我走上正确的错误处理之路。HttpResponseException是我所需要的。谢谢如果你有一个异常过滤器,我不会使用IEnumerable,我在这里是想说“…抛出一个HttpResponseException…”是我所需要的。感谢@jasongive,wait
未在GetMyItems()
中使用,其签名应为public IHttpActionResult GetMyItems()
。从问题中,查看哪些状态:“如果控制器操作代码不使用await
,则可以切换回更简单的签名。但是,返回的结果仍然是异步的。”如果操作方法不包括使用await
关键字,则不应返回任务。相反,您只需返回IHttpActionResult
、IEnumerable
或IQueryable
。请看问题。另见问题。
public async Task<IHttpActionResult> GetMyItems()
{
//... code ..., var myItems = await ...
return Ok(myItems);
}
public class ProductsController : ApiController
{
public IEnumerable<Product> Get()
{
return GetAllProductsFromDB();
}
}
public async Task<IHttpActionResult> GetMyItems()
{
if(!authorized)
return Unauthorized();
if(myItems.Count == 0)
return NotFound();
//... code ..., var myItems = await ...
return Ok(myItems);
}