InRequestScope无法在ExceptionLogger的上下文中工作

时间:2014-09-16 14:25:02

标签: c# asp.net-web-api ninject asp.net-web-api2 ninject.web

我有一个自定义的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.Currentnull。尽管事实上ExceptionLoggerContext对象包含一个Request对象(所以这个方法有一些请求的上下文,而不是实际的HttpContext)。

我正在使用Web API 2.2 / Ninject 3.2.2的IIS / Web Host版本。

在这种情况下,如何让InRequestScope()正常工作?

1 个答案:

答案 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>