2014-08-31 7 views
3

MVC 5에서는 에 HttpContext.Current을 사용하여 액세스 할 수 있습니다. HttpContext 이상에 액세스하는 기본 방법은 현재 RouteContext입니까?현재 RouteContext에 액세스

답변

4

먼저 RouteContext은 액세스하려는 개체가 아닙니다. 라우트가 Andled되었으므로 신호를 보내는 데 고유하게 사용되므로 MVC 내에서 흐르지 않습니다. 대신 RouteData에 액세스하려고합니다. this.ActionContext.RouteData 또는 HttpContext.Current 해당 this.ActionContext.HttpContext 또는 ActionFilter에서 직접 this.HttpContext

당신이 통과를 통해 액세스 할 수 있습니다위한 - 당신이 액세스 할 수있는 컨트롤러

: 액세스 할 수있는 몇 가지 방법으로 여기

문맥 : 당신이 DI 시스템에 액세스 할 수

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

는 (서비스의 생성자를 말하거나 SERV에 직접 액세스 할 때 얼음 공급자) 당신은 현재 요청의 ActionContext에서 얻을 수 있지만 요청의 범위 내에있을 때만 작동하며 전달 된 서비스 제공자는 요청 범위에 해당됩니다.

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

UPDATE 참고 : Beta3에와 IContextAccessor<T>에이 IScopedInstance<T>

참고로 대체 : 당신이이 돈으로 단순한 클래스 원한다면 당신은 또한 당신의 자신의 "접근 자"를 쓸 수 있습니다/Scoped 서비스로 등록 된 속성을 설정합니다.

+0

알겠습니다. 내 경우에는'MyService'의 인스턴스는'Startup.cs'에서 다음과 같이 생성됩니다 :'app.UseMvc (routes => {routes.Routes.Add (new DefaultRouter (routes.DefaultHandler, new DefaultRouteResolver (New DocumentRequest , // 여기에 IContextAccessor를 넣을 필요가있다 //)))); 이 시점에서'Func >'를 사용하여 각 요청에 대해 현재'IContextAccessor'를 보낼 수 있는가? ? – Marcus

+0

새로운 무언가가 생겼을 때 DI 선택을 취소합니다. 대신 할 수있는 일은 context.RequestServices를 통해 경로로 전달 된 HttpContext에서 현재 서비스 공급자를 얻는 것입니다.하지만 액션 컨텍스트를 사용할 수 없다는 점에 유의하십시오. 아직 라우팅 중에는 작업 선택이 실행되고 작업을 선택 한 후에 만 ​​결정됩니다 (라우팅 후 발생). –

+0

실제로 어떤 작업을하는지 이해하는 것은 흥미로울 수 있습니다 g 달성하기 위해, 거기에 전체적으로 다른 질문이있을 수 있습니다. –