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)
当然,我无法评论作者写这篇文章时的确切意图。但一般的想法是,当 HTTP 响应已经启动时,您不应该\xe2\x80\x99 修改它。这是因为响应在完全构建之前就已经可以部分发送。当您尝试更改请求时,您将收到无法修改响应的异常。
\n\n这就是为什么当您调用某些中间件并且该中间件预计会产生响应时,您不应该修改该响应;只是因为它可能会失败。
\n\n如果您调用某个中间件,并且该中间件不产生响应,那么您当然仍然可以自由地创建响应。
\n\n特别是对于异常情况,中间件通常在最后一步生成响应,例如,MVC 在内部使用操作结果对象,并且只有在最后才会执行这些对象以生成响应的实际结果。因此,在产生响应之前通常会触发异常。因此,如果遇到异常,修改响应就可以了。
\n\n顺便说一句,内置异常处理程序中间件的工作原理几乎相同。,所以这应该表明您正在做的事情没问题。您应该意识到修改响应可能会失败,因此您也应该处理这种情况,例如通过检查HasStarted属性。
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |