gpt4 book ai didi

c# - 如果在迭代 IEnumerable 时出现异常(从 Controller 返回),AspNet.Core 将返回 200 OK and invalid Json

转载 作者:太空狗 更新时间:2023-10-30 00:47:47 31 4
gpt4 key购买 nike

AspNet.Core 似乎立即开始发送 IEnumerable 的响应,而没有遍历整个集合。例如:

[HttpGet("")]
public async Task<IActionResult> GetData()
{
IEnumerable<MyData> result = await _service.GetData();
return Ok(result.Select(_mapper.MapMyDataToMyDataWeb));
}

现在在其中一个元素的映射过程中发生异常,所以我假设一个 500 响应,但实际上发生的是我得到一个 200 只有部分(和不正确的)Json。

我假设它是 Asp.Net Core 中的一项功能而不是错误,它提供了这种行为,而且通过调用例如修复它也相对容易ToList(),但我想知道是否有某种标志可以防止这种情况发生,因为它实际上没有意义,例如API 项目和标准 JSON 响应。

我无法在文档中找到任何描述此行为以及如何防止它的内容。

附言我已经验证调用 ToList() 修复了问题并且响应是 500 并有正确的异常(使用 UseDeveloperExceptionPage)

最佳答案

看来这实际上是“设计使然”,这个issue在 Asp.Net Core github 存储库上被提出过几次。

发生的情况是带有 200 的 header 已经发送,而正文没有。虽然我认为枚举必须在发送 header 之前进行,但 asp.net 团队表示它将在服务器上使用更多资源,这就是为什么会这样。

引用一段话:

It is very likely the case that your exception is thrown while writing to the body, after headers have already been sent to the client, so there's no take-backs on the 200 that was already sent as part of the response. The client will see an error because the body will come back as incomplete.

If you want to deterministically report a 500 when this happens you'll need to either:

我可以确认这个解决方案有效:

  1. 引用Microsoft.AspNetCore.Buffering
  2. app.UseMvc()之前写上app.UseResponseBuffering()

关于c# - 如果在迭代 IEnumerable 时出现异常(从 Controller 返回),AspNet.Core 将返回 200 OK and invalid Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55279248/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com