处理Owin / Katana和Autofac中的DI错误

时间:2015-10-19 08:47:17

标签: .net error-handling owin autofac katana

我使用Autofac DI集成了一个WebApi2 Owin自主应用程序。最近我花了一些时间来解决中间件构造函数注入的问题,没有任何提示或任何有用的异常细节,并想知道如何改进下面的代码以提供所有情况下的错误详细信息。我正在使用recommended approach for global error handling,但看起来它并不能处理所有事情。请考虑以下代码段:

中间件:

public class ClientCertificateAuthenticationMiddleware : AuthenticationMiddleware<ClientCertificateAuthenticationOptions>
{
    IClaimAuthorizationProvider claimProvider;

    public ClientCertificateAuthenticationMiddleware(OwinMiddleware next, ClientCertificateAuthenticationOptions options, IClaimAuthorizationProvider claimProvider)
        : base(next, options)
    {
        this.claimProvider = claimProvider;
    }

    protected override AuthenticationHandler<ClientCertificateAuthenticationOptions> CreateHandler()
    {
        return new ClientCertificateAuthenticationHandler(claimProvider);
    }
}

App builder,DI配置

HttpConfiguration config = new HttpConfiguration();
// error handling
config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler());
config.Services.Add(typeof(IExceptionLogger), new GlobalExceptionLogger());
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

// DI registrations
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<ClaimAuthorizationProvider>().As<IClaimAuthorizationProvider>().InstancePerLifetimeScope();
// missing registration causing the error
//builder.RegisterInstance(new ClientCertificateAuthenticationOptions());
builder.RegisterType<ClientCertificateAuthenticationMiddleware>().InstancePerRequest();    
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

// integrate Autofac into Owin pipeline
appBuilder.UseAutofacMiddleware(container);
appBuilder.UseAutofacWebApi(config);

appBuilder.UseWebApi(config);

通过此配置,我收到了以下回复,但未点击IExceptionHandlerIExceptionLogger

  

HTTP / 1.1 500内部服务器错误

     

内容长度:0

     

服务器:Microsoft-HTTPAPI / 2.0

     

日期:星期一,2015年10月19日07:55:00 GMT

问题的原因非常简单 - 缺少依赖注册(被注释掉的那个),但没有任何错误细节,它不容易解决,所以我的问题是:我如何配置应用程序,以便所有异常,绝对未处理的所有内容都会记录详细信息吗?(我期待的IExceptionHandler

1 个答案:

答案 0 :(得分:1)

我认为全局(webapi)错误处理程序和错误记录器正在拦截Webapi层/中间件中的异常。对于所有其他中间件,如上面的自定义身份验证,您必须处理错误处理/日志记录。