ExceptionHandlerMiddleware
将其用作:
if (context.Response.HasStarted ||...)
我不太明白。当请求仍在管道中时,Web 服务器如何开始向客户端发送响应(假设
ExceptionHandlerMiddleware
是管道中的第一个中间件)?因为请求还没有离开 ExceptionHandlerMiddleware
,所以它不可能到达 Web 服务器,那么在这种情况下 Web 服务器怎么可能已经开始向客户端发送响应呢?
任何中间件或处理程序都可以选择在 WriteAsync
上调用
HttpResponse
(或其他类似方法),可能会多次。
所有这些写入不一定都存储在本地缓冲区中,而且实际上可能不希望只在本地缓冲。因此,迟早,这些
Write
调用将导致通过网络发送真实数据。
并且,在这个具体示例中,处理程序可能在遇到导致控制权返回到
ExceptionHandlerMiddleware
的错误条件之前进行了多次调用,例如上面的调用。
您的具体
ExceptionHandlerMiddleware
示例使用 Microsoft.AspNetCore.Http.HttpResponse.HasStarted
:
获取一个值,指示响应标头是否已发送到客户端。
还有
Microsoft.Net.Http.Server.Response.HasStarted
:
指示响应状态、原因和标头是否已准备好发送且无法再修改。这是由第一次写入或刷新响应正文引起的。
每个响应由两部分组成:Header和Body
这两个一起发送给客户端,首先是headers,然后是body。因此,在开发过程中,在响应对象上设置影响标头的任何值的唯一机会是在您开始发送正文时。
只要您开始发送响应正文,您就无法再更改标头,因为它们是在正文开始发送之前作为响应的第一部分发送的。