gpt4 book ai didi

c# - Owin WebApi 服务忽略 ExceptionFilter

转载 作者:行者123 更新时间:2023-11-30 21:49:00 24 4
gpt4 key购买 nike

堆栈,

出于某种原因,我的 Owin WebApi 服务忽略了我们的自定义异常处理程序。我正在关注 asp.net exception handling 的文档.以下是简化的实现细节(删除了业务专有内容)。

有人能指出我忽略了什么吗?

自定义异常过滤器:

public class CustomExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
actionExecutedContext.Response.StatusCode = HttpStatusCode.NotFound;
actionExecutedContext.Response.Content = new StringContent("...my custom business...message...here...");
}
}

在启动期间:

var filter = new CustomExceptionFilter();
config.Filters.Add(filter);
appBuilder.UseWebApi(config);

测试 Controller :

[CustomExceptionFilter]
public class TestController: ApiController
{
public void Get()
{
throw new Exception(); // This is a simplification.
// This is really thrown in buried
// under layers of implementation details
// used by the controller.
}
}

最佳答案

你可以尝试实现Global Error Handling in ASP.NET Web API 2 .这样,您将获得 Web API 中间件的全局错误处理程序,但不适用于 OWIN 管道中的其他中间件,例如授权中间件。

如果你想实现一个全局错误处理中间件,this , thisthis链接可以为您定位。

希望对你有帮助。

编辑

关于@t0mm13b的评论,我会根据第一个this做一点解释。链接来自 Khanh TO .

对于全局错误处理,您可以编写一个自定义的简单中间件,它只将执行流传递给管道中的以下中间件,但位于 try block 内。

如果管道中的以下中间件之一存在未处理的异常,它将在 catch block 中捕获:

public class GlobalExceptionMiddleware : OwinMiddleware
{
public GlobalExceptionMiddleware(OwinMiddleware next) : base(next)
{ }

public override async Task Invoke(IOwinContext context)
{
try
{
await Next.Invoke(context);
}
catch (Exception ex)
{
// your handling logic
}
}
}

Startup.Configuration() 方法中,如果要处理所有其他中间件的异常,请首先将中间件添加到管道中。

public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use<GlobalExceptionMiddleware>();
//Register other middlewares
}
}

正如 Tomas Lycken 所指出的在第二个 this链接,您可以使用它来处理 Web API 中间件中生成的异常,创建一个实现 IExceptionHandler 的类,它只抛出捕获的异常,这样全局异常处理程序中间件将捕获它:

public class PassthroughExceptionHandler : IExceptionHandler
{
public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
{
// don't just throw the exception; that will ruin the stack trace
var info = ExceptionDispatchInfo.Capture(context.Exception);
info.Throw();
}
}

不要忘记在 Web API 中间件配置期间替换 IExceptionHandler:

config.Services.Replace(typeof(IExceptionHandler), new PassthroughExceptionHandler());

关于c# - Owin WebApi 服务忽略 ExceptionFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37261152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com