【问题标题】:Returning Actionresult<IEnumerable<T>> with proper Http Code with GET使用 GET 返回带有正确 Http 代码的 Actionresult<IEnumerable<T>>
【发布时间】:2022-12-28 19:56:48
【问题描述】:

我在考虑如何正确处理集合的返回码

如果您只有一个值(POCO/模型)——没问题,如果有时您需要返回Http-204。例如,在登录期间。你只要做

if (model == null)
    return NoContent();
return Ok(model);

我看到这篇文章 --https://weblog.west-wind.com/posts/2020/Feb/24/Null-API-Responses-and-HTTP-204-Results-in-ASPNET-Core

比方说,您有一个系统,对于集合,“提供者”总是返回非物化的IEnumerable&lt;T&gt;。还有点return Ok(result)不知道有没有内容。唯一知道的方法是致电.ToList(),获取Count并就此做出决定。这是我想将有效的空结果作为Http-204代码处理的时候

我理解,作者在文章中的立场是空集合仍然应该返回200。 这是普遍接受的行为或意见吗? 否则,只要我没有 null 来自 provider.Get(..) 电话,我就可以安全地返回格式正确的 (application/json) '200' 响应。

当我需要提前知道项目计数时是否存在任何性能影响问题,如果我在返回OkNoContent之前通过调用ToList()实现IEnumerable&lt;T&gt;

【问题讨论】:

    标签: rest asp.net-core asp.net-web-api .net-6.0


    【解决方案1】:

    我的 2 美分是:

    1. 只要 API 的使用者清楚就可以。
    2. 我认为对此没有商定的行业标准。
    3. IAsyncEnumerable 变得更加微妙。

      更多的

      当我需要提前知道项目计数并且如果我在返回 Ok 或 NoContent 之前通过调用 ToList() 实现 IEnumerable&lt;T&gt; 时,是否存在任何性能影响问题?

      我不认为对此有一个普遍的答案。这取决于你如何实施它。例如,如果您 result.ToList().Count() 检查是否返回 204,然后返回 result,则工作可以完成两次。


      唯一知道的方法是调用 .ToList(),获取 Count 并据此做出决定。

      值得指出的是Any()。这并不意味着您应该使用它,因为Any 的作用取决于IEnumerable 的来源。

    【讨论】:

    • “......如果返回 204 然后返回结果,工作可以完成两次。”, 绝对地。如果我实现它,我不会返回 IEnumerable 结果。我会返回结果列表。而且,是的,我可以对列表使用Any,或者列表的Count属性,如果我调用方法IEnumerable&lt;T&gt;.Count(),这将不会导致双重执行。回到那个列表返回。当 asp.net 执行您的操作方法时,它会得到 ActionResult&lt;IEnumerable&lt;T&gt;&gt;。它通过 json 序列化程序迭代它来实现它,我不认为如果我实现自己可以做任何恶意的事情。但是我没有反映
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多