繁体   English   中英

返回 IHttpActionResult 与 IEnumerable<Item> vs IQueryable<Item>

[英]Returning IHttpActionResult vs IEnumerable<Item> vs 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>

您应该返回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);
}

IEnumerableIQueryable只会将您的数据解析为输出格式,您将没有正确的方法来处理异常。 这是最重要的区别。

我会在 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。 了解更多信息。

如果您来到这里,您可能正在寻找如何在返回 IEumerable 的 API 中返回错误状态代码而不是实际数据。

答案是,抛出一个HttpResponseException 那么就没有必要使用一个ActionResult ,它会弄乱原本干净的代码。

这是来自Docs的完整示例:

var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
    {
        Content = new StringContent(string.Format("No product with ID = {0}", id)),
        ReasonPhrase = "Product ID Not Found"
    };
    throw new HttpResponseException(resp);

这个答案的功劳归功于上面的@JasonWatmore。 这只是为了让这个技巧更清楚,因为它非常有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM