我有一个简单的Web API Core v3.1,正在尝试全局处理异常。遵循此答案https://stackoverflow.com/a/55166404/1508398之后,这是我执行此操作的代码。
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);
}));
我在context.Response.WriteAsync(result);
处遇到的错误是:
System.ObjectDisposedException:无法访问关闭的Stream。
我很确定我缺少一些基本的知识,但无法弄清楚。
我本质上需要在异常发生时将响应包装到一个对象中。
[似乎其他人(另一中间人)已经关闭了视频流。
在.net-core中,订购很重要。记住您共享的链接:
重要:请记住,将其添加到UseMvc(或.Net Core 3中的UseRouting)之前,因为顺序很重要。
因此,在其他UseExceptionHandler
和/或配置声明之前声明Middlewhate
。>
Check the middleware guide here
与使用一起束缚多个请求委托。下一个参数代表管道中的下一个委托。您可以通过不调用下一个参数来使管道短路。您通常可以在下一个委托之前和之后执行操作,如以下示例所示:
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."); });
UseExceptionHandler是添加到管道中的第一个中间件组件。因此,异常处理程序中间件将捕获以后调用中发生的所有异常。
第一次运行,终止管道。因此,您可以做一些工作,但是最后,在第一次运行时,响应将关闭。
请分享更多代码,以帮助我们提供更多帮助。