2

我正在尝试为我的 IoC 容器(autofac)注册 RequestContext。我在 Application_start 中完成所有注册。

RequestContext 注册如下所示:

builder.Register(x => HttpContext.Current.Request.RequestContext).As<RequestContext>();

这在开发网络服务器上运行良好,但在 IIS 7(集成模式)中,问题是 RequestContext 上下文在 Application_start 中不可用。

我可以在这里做什么?

4

1 回答 1

5

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

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

如果您使用 Autofac MVC 集成,您可以为注册做的最简单的事情是:

builder.RegisterModule<AutofacWebTypesModule>();

已经有一个模块可以注册各种 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();

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

如果由于 RequestContext 不可用而在应用程序启动时出现错误,那么在您的应用程序的某个地方,您正在尝试在实际收到请求之前解决使用 RequestContext 的问题。例如,手动尝试解析将 RequestContext 作为构造函数参数的内容的 HttpModule 实现。

注册中的 lambda 实际上直到解决才被评估,因此错误可能来自您正在解决的问题,即试图过早使用 RequestContext。

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

默认情况下,你会得到一个异常,这可能就是你现在看到的。

如果您希望它为空,请进行如下注册:

// 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>();

这应该可以帮助您解决应用程序启动问题。

综上所述……您应该弄清楚在应用程序启动时尝试使用 RequestContext 的原因,看看您是否可以修复设计。在正常情况下,您不应该最终需要做这种事情。

于 2012-06-08T15:53:56.867 回答