例外是关于在 next() 之后不修改响应的规则的例外吗?



在试图找到为任何未捕获的异常实现包罗万象的最佳方法时,我发现了这个。

但是,在实施它时,我想起了我读到的地方:

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

第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(...);
}
}

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

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

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

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

内置的异常处理程序中间件的工作方式几乎相同,所以这应该表明你正在做的事情很好。您应该只知道修改响应可能会失败,因此您也应该处理这种情况,例如通过检查HasStarted属性。

最新更新