如果在迭代IEnumerable时发生异常(从控制器返回),AspNet.Core将返回200 OK且Json无效

Ily*_*dik 4 c# http httpresponse .net-core asp.net-core

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

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

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

我认为这Asp.Net Core是提供此行为的功能而不是错误,并且通过调用eg可以相对容易地修复ToList(),但是我想知道是否存在某种标志可以阻止这种情况的发生,因为它并不能真正使这种情况发生。例如API项目和标准JSON响应的含义。

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

PS我已经验证了呼叫可以ToList()解决此问题,并且响应为500,带有正确的异常(带有UseDeveloperExceptionPage

Ily*_*dik 6

看来这实际上是“设计使然”,在Asp.Net Core github存储库中已多次提出此问题

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

这是一个报价:

很可能是在将标头发送到客户端之后,在写入正文时引发异常的情况,因此,已经作为响应的一部分发送的200没有收回。客户端会看到一个错误,因为主体将返回为不完整。

如果您想确定地报告500,请执行以下任一操作:

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

  1. 参考Microsoft.AspNetCore.Buffering
  2. app.UseResponseBuffering()之前app.UseMvc()