Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回IHttpActionResult vs IEnumerable<;项目>;vs IQueryable<;项目>;_C#_Asp.net_Asp.net Web Api_Async Await_Asp.net Web Api2 - Fatal编程技术网

C# 返回IHttpActionResult vs IEnumerable<;项目>;vs IQueryable<;项目>;

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

在ASP.NET Web API 2中,以下各项之间的区别是什么

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响应的公共逻辑移动到单独的类中
  • 通过隐藏构造响应的低级细节,使控制器操作的意图更加清晰
IEnumerable

对于所有其他返回类型,Web API使用媒体格式化程序来序列化返回值。Web API将序列化的值写入响应体。响应状态代码为200(正常)

公共类产品控制器: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);
}