C# 抛出异常的IEnumerable在ASP.NET核心Web API中传递到OkResult时返回无效的Json
在Visual Studio中启动新的ASP.NET核心Web API项目 现在将ValuesController.Get()操作更改为:C# 抛出异常的IEnumerable在ASP.NET核心Web API中传递到OkResult时返回无效的Json,c#,asp.net-core,asp.net-core-webapi,C#,Asp.net Core,Asp.net Core Webapi,在Visual Studio中启动新的ASP.NET核心Web API项目 现在将ValuesController.Get()操作更改为: // GET api/values [HttpGet] public ActionResult<IEnumerable<string>> Get() { var results = new[] {"hi"}.Select<string, string>(x => throw new ArgumentExcep
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
var results = new[] {"hi"}.Select<string, string>(x => throw new ArgumentException());
return Ok(results);
}
这里发生了什么?在第一个示例中,状态代码和响应头在JSON序列化开始之前发送到客户端。为JSON serialiser提供一个
IEnumerable
会导致延迟创建集合,这最终会在序列化过程中执行。这意味着在抛出异常之前发送200个状态代码和响应头。由于状态代码已发送,因此无法将其从200更改为200。响应也不能“撤消”——它是一个只向前的数据流
在第二个示例中,集合是在JSON序列化过程运行之前创建的。在这种情况下,在调用
returnok(results)
之前抛出异常。无论您用于全局异常处理的是什么,都会捕获此异常并写出一个状态代码为500的响应。我猜这是故障安全响应写入。它尝试写入响应,但失败,从而关闭返回的流。如果我是你,我会调查ASP.NET引发的隐藏异常。
var results = new[] {"hi"}.Select<string, string>(x => throw new ArgumentException());
results.ToList();
return Ok(results);