在 IQueryable<Log> Web API 操作上返回 204 状态代码

Posted

技术标签:

【中文标题】在 IQueryable<Log> Web API 操作上返回 204 状态代码【英文标题】:Return 204 Status Code on IQueryable<Log> Web API Action 【发布时间】:2021-07-27 17:00:03 【问题描述】:

我正在使用web apiJSONcustom CVS 解析器导出大量数据。一切正常,但我想在查询返回 0 条记录时返回 204 status code。我找不到设置状态码的方法,因为我返回IQueryable&lt;Log&gt;。有什么建议吗?

   [HttpGet]
   [Route("user/statistic")]

    public IQueryable<Log> Statistic(int userId, DateTime startDate, DateTime endDate, CancellationToken cancellationToken)
    

        var logs = _context.Find(userId, startDate, endDate);
        return logs;
    

    public IQueryable<Log> Find(int userId, DateTime startDate, DateTime endDate)
    
        var startDateSql = startDate.AddDays(-1).Date;
        var endDateTimeSql = endDate.AddDays(1).Date;
        return Logs.Where(w => w.UserId == userId && w.DateStamp > startDateSql && w.DateStamp < endDateTimeSql).AsNoTracking();
    

【问题讨论】:

HttpContext.Response.StatusCode = 204;值得一试 【参考方案1】:

尝试在您的 API 方法中使用 IActionResult 而不是 IQueryable 那么你可以有这样的东西:

public IActionResult MyApi()

    // if the result has any item
    return Ok(result);

    // otherwise
    return NoContent(); // which returns 204 status code

【讨论】:

我无法在操作中执行 IQueryable,我将其传递给 Formatter 并让他们处理大量数据。您建议执行整个查询,并在我的情况下造成很大的性能损失。 当您收到响应时,执行查询并不重要,与 IActionResult 没有什么不同,如果它在方法中是性能优化,但通常不建议使用 IEnumerable , Iquerable 等用于 HTTP 端点的结果,然后您可以产生合理的响应 好的,请使用我的代码并将其与您的代码合并,并且不要忘记插入取消标记,以让 Web 操作在断开连接时取消从数据库中查询数据。当您很快发现在 Action 中一次获取所有数据时,无法使用您的建议从数据库中创建块读取。这就是我使用 IQueryable 的原因,当需要返回大量 fo 数据时,我找不到其他方法。

以上是关于在 IQueryable<Log> Web API 操作上返回 204 状态代码的主要内容,如果未能解决你的问题,请参考以下文章

IQueryable 和 IQueryable<T> 是异步的吗?

以更好的性能将 IQueryable<X> 转换为 IQueryable<Y>

返回 IEnumerable<T> 与 IQueryable<T>

返回 IEnumerable<T> 与 IQueryable<T>

将 IQueryable<int> 转换为 <int>

IList<T> 到 IQueryable<T>