异常是否是关于next()之后不修改Response的规则的例外?

Chi*_*ils 5 c# asp.net-core asp.net-core-webapi

在尝试找到对所有未捕获的异常实施全面捕获的最佳方法时,我发现了这一点

但是,在实现它的过程中,我想起了我读过的内容

警告不要Response在调用next()... 后修改对象,因为响应可能已经开始发送,并且可能导致发送无效数据。

pg。580

当中间件在MVC中间件之前充当全局异常处理程序时,如果调用异常中间件似乎没有任何响应可以启动,这是否合理,这是一个问题吗?

Invoke 在中间件上:

public async Task Invoke(HttpContext context)
{
    try
    {
        await _next(context);
    }
    // A catch-all for uncaught exceptions...
    catch (Exception exception)
    {
        var response = context.Response;
        response.ContentType = "application/json";
        response.StatusCode = (int)HttpStatusCode.InternalServerError;

        await response.WriteAsync(...);
    }
}
Run Code Online (Sandbox Code Playgroud)

pok*_*oke 1

当然,我无法评论作者写这篇文章时的确切意图。但一般的想法是,当 HTTP 响应已经启动时,您不应该\xe2\x80\x99 修改它。这是因为响应在完全构建之前就已经可以部分发送。当您尝试更改请求时,您将收到无法修改响应的异常。

\n\n

这就是为什么当您调用某些中间件并且该中间件预计会产生响应时,您不应该修改该响应;只是因为它可能会失败。

\n\n

如果您调用某个中间件,并且该中间件不产生响应,那么您当然仍然可以自由地创建响应。

\n\n

特别是对于异常情况,中间件通常在最后一步生成响应,例如,MVC 在内部使用操作结果对象,并且只有在最后才会执行这些对象以生成响应的实际结果。因此,在产生响应之前通常会触发异常。因此,如果遇到异常,修改响应就可以了。

\n\n

顺便说一句,内置异常处理程序中间件的工作原理几乎相同。,所以这应该表明您正在做的事情没问题。您应该意识到修改响应可能会失败,因此您也应该处理这种情况,例如通过检查HasStarted属性

\n