在Application_start中注册RequestContext(global.asax)

use*_*126 2 asp.net-mvc inversion-of-control autofac

我正在尝试为我的IoC容器(autofac)注册RequestContext.我在Application_start中进行所有注册.

RequestContext注册如下所示:

builder.Register(x => HttpContext.Current.Request.RequestContext).As<RequestContext>();
Run Code Online (Sandbox Code Playgroud)

这在dev webserver上工作正常,但在IIS 7(集成模式)中,问题是Application_start中没有RequestContext上下文.

我能在这做什么?

Tra*_*lig 5

看来这里有两个问题需要解决:

  1. 你如何注册RequestContext?
  2. 为什么RequestContext没有正确解析?

如果您正在使用Autofac MVC集成,那么您最容易注册的是:

builder.RegisterModule<AutofacWebTypesModule>();
Run Code Online (Sandbox Code Playgroud)

已经有一个模块可以注册各种Web抽象(HttpContextBase,RequestContext等),这些抽象适当地限定为每个HTTP请求实例.经过测试,可以为您节省大量时间.

相反,如果您想自己手动注册它,那么如果您将其范围限定为InstancePerHttpRequest,则执行您所拥有的操作(这样您就不会在每个请求上反复执行).

此外,您可以像在模块中一样将其"链接"到当前上下文中:

builder.Register(c => new HttpContextWrapper(HttpContext.Current))
    .As<HttpContextBase>()
    .InstancePerHttpRequest();
builder.Register(c => c.Resolve<HttpRequestBase>().RequestContext)
    .As<RequestContext>()
    .InstancePerHttpRequest();
Run Code Online (Sandbox Code Playgroud)

这照顾第一部分,但第二部分有点棘手.

如果您在应用启动时遇到错误,因为RequestContext不可用,那么在您的应用中的某个位置,您尝试在实际拥有请求之前解析使用RequestContext的内容.例如,一个HttpModule实现,它手动尝试解析具有RequestContext作为构造函数参数的东西.

注册中的lambda实际上不会在解决之前得到评估,因此错误可能来自你正在解决的过早尝试使用RequestContext的问题.

在这种情况下,问题是:当您尝试解析RequestContext并且没有请求时,您希望如何处理解决方案?

默认情况下,您将获得一个异常,这可能就是您现在所看到的.

如果您希望它为null,那么请执行以下注册:

// Register context as instance-per-dependency and handle the
// case where it's null. Also handle HttpException because IIS7
// can throw if you access HttpContext.Current too soon in app startup.
builder.Register(
  c => {
    try
    {
      var ctx = HttpContext.Current;
      return ctx == null ? null : new HttpContextWrapper(ctx);
    }
    catch(HttpException)
    {
      return null;
    }
  }).As<HttpContextBase>();

// RequestContext also gets registered instance-per-dependency
// and handles the null context case.
builder.Register(
  c => {
    var ctx = c.Resolve<HttpRequestBase>();
    return ctx == null ? null : ctx.RequestContext;
  }).As<RequestContext>();
Run Code Online (Sandbox Code Playgroud)

那会让你超越应用启动问题.

所有这些...... 你应该弄清楚什么是在应用程序启动时尝试使用RequestContext,看看你是否可以修复设计.在正常情况下,你不应该最终需要做这类事情.