2

我有一个自定义的 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 的其他实例不同。这似乎是由于HttpContext.CurrentnullLog() 方法中。尽管 ExceptionLoggerContext 对象包含一个 Request 对象(所以这个方法有一些请求上下文,而不是实际的 HttpContext)。

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

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

4

1 回答 1

2

事实证明,这种行为是以下原因的结果:

为什么 HttpContext.Current 在等待之后为空?

添加targetFramework="4.5"到 web.config 中的 httpRuntime 导致 HttpContext 在此方法中不再为空。因此,这修复了 InRequestScope() 的行为。

<system.web>
   <httpRuntime targetFramework="4.5" />
</system.web>
于 2014-09-16T14:47:20.993 回答