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

.net 处理Owin/Katana和Autofac中的DI错误,.net,error-handling,owin,autofac,katana,.net,Error Handling,Owin,Autofac,Katana,我有一个使用Autofac DI集成的WebApi2 Owin自主机应用程序。最近,我花了一些时间在没有任何提示或任何有用的异常详细信息的情况下对中间件构造函数注入的问题进行故障排除,并想知道如何改进下面的代码,以便在所有情况下提供错误详细信息。我正在使用,但看起来它不能处理所有问题。考虑下面的片段: 中间件: public class ClientCertificateAuthenticationMiddleware : AuthenticationMiddleware<ClientCe

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

中间件:

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);
    }
}
公共类ClientCertificateAuthenticationMiddleware:AuthenticationMiddleware
{
ICLAIMAU授权供应商分类改进商;
公共ClientCertificateAuthenticationMiddleware(OwinMiddleware下一步,ClientCertificateAuthenticationOptions选项,ICLAIMAU授权提供程序claimProvider)
:base(下一步,选项)
{
this.claprovider=claprovider;
}
受保护的重写AuthenticationHandler CreateHandler()
{
返回新的ClientCertificateAuthenticationHandler(claimProvider);
}
}
应用程序生成器,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);
HttpConfiguration config=new-HttpConfiguration();
//错误处理
Replace(typeof(IEExceptionHandler),newGlobalExceptionHandler());
Add(typeof(IEExceptionLogger),新的GlobalExceptionLogger());
config.IncludeErrorDetailPolicy=IncludeErrorDetailPolicy.Always;
//直接投资注册
var builder=new ContainerBuilder();
RegisterAppController(Assembly.getExecutionGassembly());
builder.RegisterType();
//缺少注册导致错误
//RegisterInstance(新客户端证书身份验证选项());
builder.RegisterType().InstancePerRequest();
var container=builder.Build();
config.DependencyResolver=新的AutoFacWebApidencyResolver(容器);
//将Autofac集成到Owin管道中
appBuilder.useAutofacidleware(容器);
appBuilder.UseAutofacWebApi(配置);
appBuilder.UseWebApi(配置);
通过此配置,我得到了以下响应,而没有命中
IEExceptionHandler
IEExceptionLogger

HTTP/1.1500内部服务器错误

内容长度:0

服务器:Microsoft HTTPAPI/2.0

日期:2015年10月19日星期一格林尼治标准时间07:55:00


问题的原因很简单-缺少依赖项注册(被注释掉的一个),但是没有任何错误详细信息,很难确定下来,因此我的问题是:如何配置应用程序,以便所有异常,绝对是所有未处理的都记录详细信息?(这是我从
IExceptionHandler
期待的)

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

谢谢@bandreas!您说得对,在应用程序顶部推送一个简单的异常记录中间件非常有帮助。