Оказывается, есть две проблемы, которые необходимо решить здесь:
- Как вы зарегистрировать RequestContext?
- Почему не правильно разрешен RequestContext?
Самый простой, что вы можете сделать для регистрации, если вы используете интеграцию Autofac MVC является:
builder.RegisterModule<AutofacWebTypesModule>();
Существует уже модуль, который регистрирует различные веб-абстракций (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, прежде чем вы действительно получите запрос. Например, реализация HttpModule, которая вручную пытается решить что-то, что имеет RequestContext в качестве параметра конструктора.
Лямбда в регистрации фактически не оценивается до разрешения, поэтому ошибка, вероятно, происходит из-за того, что вы разрешаете, пытающегося слишком рано использовать 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 при запуске приложения и посмотреть, можете ли вы исправить дизайн. Вы не должны в конечном итоге делать такие вещи в нормальных условиях.