Web API Core 3.1 ExceptionHandler 中间件在写入 HttpContext.Response 时抛出“无法写入关闭的流”

bit*_*bit 5 c# asp.net-core-webapi .net-core-3.1

我有一个简单的 Web API Core v3.1,我试图在其中全局处理异常。遵循此答案/sf/answers/3861648311/后,这是我执行此操作的代码。

 app.UseExceptionHandler(appBuilder => appBuilder.Run(async context =>
 {
     var exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>();
     var exception = exceptionHandlerPathFeature.Error;

     var result = JsonConvert.SerializeObject(new { error = exception.Message });
     context.Response.ContentType = "application/json";
     await context.Response.WriteAsync(result);
 }));
Run Code Online (Sandbox Code Playgroud)

我得到的错误是context.Response.WriteAsync(result);

System.ObjectDisposeException:无法访问关闭的流。

我很确定我错过了一些基本的东西,但无法弄清楚这一点。

每当发生异常时,我基本上需要将响应包装到一个对象中。

Ath*_*ras 2

看起来其他人(另一个中间件)已经关闭了流。

在 .net-core 中,顺序很重要。请记住您分享的链接中:

重要提示:请记住在 UseMvc(或 .Net Core 3 中的 UseRouting)之前添加它,因为顺序很重要。

UseExceptionHandler因此,在任何其他Middleware和/或配置声明之前声明。

在此处查看中间件指南

将多个请求委托链接在一起Use。下一个参数代表管道中的下一个委托。您可以通过不调用下一个参数来短路管道。您通常可以在下一个委托之前和之后执行操作,如以下示例所示:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Use(async (context, next) =>
        {
            // Do work that doesn't write to the Response.
            await next.Invoke();
            // Do logging or other work that doesn't write to the Response.
        });

        app.Run(async context =>
        {
            await context.Response.WriteAsync("Hello from 2nd delegate.");
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

UseExceptionHandler是添加到管道中的第一个中间件组件。因此,异常处理程序中间件会捕获后续调用中发生的任何异常。

第一次运行,终止管道。因此您可以做一些工作,但最终当第一次运行发生时,响应将关闭。

请分享更多代码,以便我们提供更多帮助。