【问题标题】:Return 204 Status Code on IQueryable<Log> Web API Action在 IQueryable<Log> Web API 操作上返回 204 状态代码
【发布时间】: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;值得一试

标签: c# asp.net-web-api rest


【解决方案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 数据时,我找不到其他方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多