看来这里有两个问题需要解决:
- 你如何注册RequestContext?
- 为什么 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 的原因,看看您是否可以修复设计。在正常情况下,您不应该最终需要做这种事情。