2012-06-08 2 views
2

Я пытаюсь зарегистрировать RequestContext для моего контейнера IoC (autofac). Я делаю всю регистрацию в Application_start.Регистрация RequestContext в Application_start (global.asax)

RequestContext регистрации выглядит следующим образом:

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

это работает отлично на Dev веб-сервера, но в IIS 7 (интегрированный режим) проблема заключается в том, что RequestContext контекст не доступен в Application_Start.

Что я могу сделать здесь?

ответ

5

Оказывается, есть две проблемы, которые необходимо решить здесь:

  1. Как вы зарегистрировать RequestContext?
  2. Почему не правильно разрешен 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 при запуске приложения и посмотреть, можете ли вы исправить дизайн. Вы не должны в конечном итоге делать такие вещи в нормальных условиях.

Смежные вопросы