Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抛出异常的IEnumerable在ASP.NET核心Web API中传递到OkResult时返回无效的Json_C#_Asp.net Core_Asp.net Core Webapi - Fatal编程技术网

C# 抛出异常的IEnumerable在ASP.NET核心Web API中传递到OkResult时返回无效的Json

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

在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 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);