2014-08-31 3 views
3

В MVC 5 I вы можете получить доступ к HttpContext, используя HttpContext.Current. Каков предпочтительный способ доступа к HttpContext или лучше, только текущий RouteContext?Доступ к текущему RouteContext

ответ

4

Первый RouteContext не является объектом, к которому вы хотите получить доступ. Он уникально используется, чтобы сигнализировать, был ли маршрут маршрутизирован и, следовательно, не течет внутри MVC. Вероятно, вы захотите получить доступ к RouteData.

Вот как несколько способов доступа к нему:

На контроллере вы можете получить доступ - this.ActionContext.RouteData или для HttpContext.Current эквивалент this.ActionContext.HttpContext или непосредственно this.HttpContext

в ActionFilter вы можете получить доступ к ним через пропущенный в контексте:

public void OnActionExecuting(ActionExecutingContext context) 
{ 
    var routeData = context.RouteData; 
    var httpContext = context.HttpContext; 
    ... 
} 

в любом другом месте, где есть доступ к системе DI (скажем, конструктор службы, или если у вас есть прямой доступ к серв ice provider) вы можете получить в текущем запросе ActionContext, но обратите внимание, что это работает только в том случае, если вы находитесь в пределах объема запроса, и ваш сервисный сервис, который вы получили, привязан к запросу.

public MyService(IScopedInstance<ActionContext> contextAccessor) 
{ 
    _httpContext = contextAccessor.Value.HttpContext; 
    _routeData = contextAccessor.Value.RouteData; 
} 

UPDATE Примечание: С Beta3 и IContextAccessor<T> был заменен IScopedInstance<T>

Примечание: Вы также можете просто написать свой собственный «Accessor», если вы хотите, это просто простой класс с GET/set свойство, которое регистрируется как служба Scoped.

+0

Хорошо, я вижу. В моем случае экземпляр 'MyService' создается в' Startup.cs' следующим образом: 'app.UseMvc (routes => {routes.Routes.Add (новый DefaultRouter (routes.DefaultHandler, новый DefaultRouteResolver (новый RouteResolverTrie (DocumentStore) , // Мне нужно разместить здесь IContextAccessor //)))); ' Можно ли использовать' Func > 'в этот момент, чтобы я мог отправить текущий IContextAccessor для каждого запроса ? – Marcus

+0

Когда вы что-то новое, вы отказываетесь от DI. Так что вы можете сделать, чтобы получить текущего поставщика услуг из HttpContext, переданного в ваш маршрут, через context.RequestServices. Но обратите внимание, что контекст действия недоступен но во время маршрутизации он определяется только после запуска выбора действия и выбрал действие (которое происходит после маршрутизации). –

+0

Возможно, было бы интересно понять, что вы на самом деле пытаетесь Чтобы достичь этого, здесь может возникнуть совершенно другой вопрос. –

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