c# - ASP.Net Core 中间件无法设置异常状态码,因为 "response has already started"

标签 c# .net asp.net-core

相关:Modify static file response in ASP.NET Core

但是,我不明白为什么当我的业务逻辑抛出我的自定义异常之一(如 UnprocessableException)时以下代码有效:

try
{
    await next.Invoke(context);
}
catch (UnprocessableException uex)
{
    Logger.Warn(uex);
    context.Response.StatusCode = 422;
    var responseContent = JsonConvert.SerializeObject(new { uex.Message });
    await context.Response.WriteAsync(responseContent);
}
// more specific exceptions resulting in HTTP 4xx status

但是当完全意外的IndexOutOfRangeException 被链中的最后一个catch block 捕获时

catch (Exception ex)
{
    Logger.Error(ex);
    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
    var responseContent = env.IsDevelopment()
                              ? JsonConvert.SerializeObject(new { ex.Message, ex.StackTrace })
                              : JsonConvert.SerializeObject(new { Message = "An internal error occured" });
    await context.Response.WriteAsync(responseContent);
}

尝试设置状态码时抛出此异常:

System.InvalidOperationException: StatusCode cannot be set, response has already started.
   bei Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.ThrowResponseAlreadyStartedException(String value)
   bei Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.set_StatusCode(Int32 value)
   bei Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.Microsoft.AspNetCore.Http.Features.IHttpResponseFeature.set_StatusCode(Int32 value)
   bei Microsoft.AspNetCore.Http.Internal.DefaultHttpResponse.set_StatusCode(Int32 value)
   bei Anicors.Infrastructure.Middlewares.ScopeMiddleware.<Invoke>d__5.MoveNext()

最佳答案

既然这是 Google 上的顶级搜索结果,我不妨告诉新来者我是如何想到这个错误的。 我正在尝试使用 this通过压缩文件并将它们下载(流式传输)到客户端来回答。我在实际 Controller 操作结束时返回了 return Ok()。我需要返回 return new EmptyResult()

关于c# - ASP.Net Core 中间件无法设置异常状态码,因为 "response has already started",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45675102/

相关文章:

c# - Controller 中的 MVC3 自动完成和 POST 方法

c# - 帮助抽象类/类/接口(interface)单元的结构

带有 out 参数的 c# 泛型委托(delegate) - 定义和调用

c# - 将 GeoJson 特征映射到属性

c# - Microsoft.Data.SqlClient与System.Data.SqlClient

c# - Java/C# 消息传递的 REST 架构的性能

c# - 将 clr 更新到 4.7 后应用程序崩溃

c# - 以编程方式使用免费代理服务器连接到网站

c# - LDAP 用户枚举不返回所有域用户

c# - 无法解析 ILogger<T> 简单注入(inject)器 ASP.NET Core 2.0