gpt4 book ai didi

c# - Owin 中间件中的 MVC 错误处理

转载 作者:行者123 更新时间:2023-11-30 14:24:38 25 4
gpt4 key购买 nike

当 Controller 中抛出某些异常时,我想捕获这些异常并执行一些额外的逻辑。

我能够通过添加到全局过滤器列表的自定义 IExceptionFilter 实现这一点。

但是,我更喜欢在自定义 Owin 中间件中处理这些异常。我的中间件如下所示:

      try
{

await Next.Invoke(context);
}
catch (AdalSilentTokenAcquisitionException e)
{
//custom logic
}

这段代码不起作用,看起来异常已经在 MVC 中被捕获和处理了。有没有办法跳过MVC的异常处理,让中间件捕获异常?

最佳答案

更新:我找到了一种更简洁的方法,请参阅下面我更新的代码。使用这种方法,您不需要自定义异常过滤器,最重要的是,您不需要在 Owin 中间件中使用 HttpContext 环境服务定位器模式。

我在 MVC 中有一个工作方法,但是,不知何故感觉不太舒服,所以我很感激其他人的意见。

首先确保MVC的GlobalFilters中没有添加异常处理器。

将此方法添加到全局asax:

    protected void Application_Error(object sender, EventArgs e)
{
var lastException = Server.GetLastError();
if (lastException != null)
{
HttpContext.Current.GetOwinContext().Set("lastException", lastException);
}
}

重新抛出异常的中间件

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

public override async Task Invoke(IOwinContext context)
{
await Next.Invoke(context);
var exception = context.Get<Exception>("lastException");
if (exception != null)
{
var info = ExceptionDispatchInfo.Capture(exception);
info.Throw();
}
}
}

关于c# - Owin 中间件中的 MVC 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40769638/

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