我有一个自定义的Web API ExceptionLogger,它在WebApiConfig中添加如下:
config.Services.Add(typeof(IExceptionLogger), new CustomExceptionLogger(kernel.Get<ILoggerFactory>());
CustomExceptionLogger是:
public class CustomExceptionLogger : ExceptionLogger
{
private readonly ILoggerFactory _logFactory;
public CustomExceptionLogger(ILoggerFactory log)
{
_logFactory = log;
}
public override void Log(ExceptionLoggerContext context)
{
var log = _logFactory.Create();
log.LogError("Unhandled exception: {0}",
context.Exception);
}
}
Ninject绑定是:
Bind<ILogger>().ToMethod(CreateLogger)
.InRequestScope();
Bind<ILoggerFactory>().ToFactory();
我正在使用Ninject.Extensions.Factory扩展。 ILoggerFactory接口是:
public interface ILoggerFactory
{
ILogger Create();
}
当调用Log()时,我希望ILoggerFactory返回一个作用于请求的ILogger实例。但是,在这种情况下,我收到一个新的ILogger实例,该实例与另一个在其他地方使用ILoggerFactory的实例不同。这似乎是由于Log()方法中的HttpContext.Current
为null
。尽管事实上ExceptionLoggerContext对象包含一个Request对象(所以这个方法有一些请求的上下文,而不是实际的HttpContext)。
我正在使用Web API 2.2 / Ninject 3.2.2的IIS / Web Host版本。
在这种情况下,如何让InRequestScope()正常工作?
答案 0 :(得分:2)
事实证明,这种行为是以下结果:
Why is HttpContext.Current null after await?
在web.config中向httpRuntime添加targetFramework="4.5"
会导致HttpContext在此方法中不再为null。这因此修复了InRequestScope()的行为。
<system.web>
<httpRuntime targetFramework="4.5" />
</system.web>