我使用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);
通过此配置,我收到了以下回复,但未点击IExceptionHandler
和IExceptionLogger
:
HTTP / 1.1 500内部服务器错误
内容长度:0
服务器:Microsoft-HTTPAPI / 2.0
日期:星期一,2015年10月19日07:55:00 GMT
问题的原因非常简单 - 缺少依赖注册(被注释掉的那个),但没有任何错误细节,它不容易解决,所以我的问题是:我如何配置应用程序,以便所有异常,绝对未处理的所有内容都会记录详细信息吗?(我期待的IExceptionHandler
)
答案 0 :(得分:1)
我认为全局(webapi)错误处理程序和错误记录器正在拦截Webapi层/中间件中的异常。对于所有其他中间件,如上面的自定义身份验证,您必须处理错误处理/日志记录。