【问题标题】:Global Exception Handler Not Called未调用全局异常处理程序
【发布时间】:2016-06-01 09:48:12
【问题描述】:

我正在尝试创建一个 oWin 中间件类,该类将捕获堆栈中的所有异常,并适当地处理它们。一个

this 文章之后,我创建了一个IExceptionHandler 类来将异常从WebApi 向上传递到中间件堆栈。

但是,这似乎不起作用。尽管调用了HandleCore 方法,并命中了info.Throw(),但中间件类中从未出现异常。

异常处理程序

public class WebApiExceptionPassthroughHandler : ExceptionHandler
{
    public override Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
    {
        HandleCore(context);

        return Task.FromResult(0);
    }

    public override void Handle(ExceptionHandlerContext context)
    {
        HandleCore(context);
    }

    private void HandleCore(ExceptionHandlerContext context)
    {
        //Pass webAPI Exceptions up the stack to the Logging Middleware - which will handle all exceptions.
        if (!ShouldHandle(context)) return;

        var info = ExceptionDispatchInfo.Capture(context.Exception);
        info.Throw();
    }

    public override bool ShouldHandle(ExceptionHandlerContext context)
    {
        return context.ExceptionContext.CatchBlock.IsTopLevel;
    }
}

启动

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Use<LoggingMiddleware>();

        GlobalConfiguration.Configure(WebApiConfig.Register);
        app.UseWebApi(GlobalConfiguration.Configuration);
    }
}

日志中间件

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

    public override async Task Invoke(IOwinContext context)
    {


        //TODO: Initialise the log
        try
        {
            await Next.Invoke(context);
        }
        catch (System.Exception ex)
        {
            //This is not getting reached.
            var i = 1;
        }
    }
}

在 webapi.config 里面,我有这个命令:

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

如何让 webApi 异常冒泡到中间件日志记录类?

【问题讨论】:

    标签: c# exception-handling asp.net-web-api2 owin


    【解决方案1】:

    如果您想搬到 Owin,请摆脱糟糕的 System.WebGlobalConfiguration。尝试在 Startup 中创建您的 Api 配置。

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Use<LoggingMiddleware>();
    
    
            var config = new HttpConfiguration();
            //Move your WebApiConfig.Register here
            config.Services.Replace(typeof(IExceptionHandler), new WebApiExceptionPassthroughHandler())
    
            //Finally use your newly created config here
            app.UseWebApi(config);
        }
    }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 1970-01-01
      • 2014-04-17
      • 2012-12-31
      • 2011-05-19
      • 2011-08-31
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多