c# - Web API Core 3.1 ExceptionHandler 中间件在写入 HttpContext.Response 时抛出“无法写入关闭的流”
问题描述
我有一个简单的 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:无法访问已关闭的流。
我很确定我错过了一些基本的东西,但无法弄清楚。
每当发生异常时,我基本上需要将响应包装到一个对象中。
解决方案
看起来其他人(另一个中间件)已经关闭了流。
在 .net-core 中,排序很重要。请记住您分享的链接:
重要提示:请记住在 UseMvc(或 .Net Core 3 中的 UseRouting)之前添加它,因为顺序很重要。
因此,UseExceptionHandler
在任何其他Middlewhate
和或配置声明之前声明。
将多个请求委托与 Use 链接在一起。下一个参数代表管道中的下一个委托。您可以通过不调用下一个参数来使管道短路。您通常可以在下一个委托之前和之后执行操作,如以下示例所示:
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是添加到管道中的第一个中间件组件。因此,异常处理程序中间件会捕获以后调用中发生的任何异常。
第一次运行,终止管道。所以你可以做一些工作,但最终当第一次运行发生时,响应将关闭。
请为我们分享更多代码以提供更多帮助。
推荐阅读
- r - 如何在正方形的特定部分生成点
- android - Xamarin Forms:从 Android Activity 返回字符串
- php - Laravel 验证:将输入与数据库中选定结果进行比较的简单方法
- oracle - PL/SQL 程序在 Oracle APEX 中上传超过 45 列的 CSV 的问题
- python - 如何使用 for 循环在另一个矩阵中插入不同的矩阵?
- google-apps-script - 修改代码 - 如果单元格有任何数据,则删除行 - Google 表格/Google Apps 脚本
- xml - Snowflake 中有没有办法处理 XML 编码 ISO-8859-1?
- sql - SQL Server 条件连接
- python - 找不到 Django 页面
- python - 如何将元组转换为具有浮点和字符串值的列表