ASP.NET MVC 1의 HttpContextBase에서 HttpContext 개체를 얻는 방법은 무엇입니까?


154

일부 WebForms / MVC 불가지론 도구로 작업하고 HttpContext있으며 HttpContextBase객체에 대한 참조가 주어진 인스턴스를 가져와야 합니다. HttpContext.Current비동기식으로도 작동해야 하기 때문에 사용할 수 없습니다 ( 비동기 요청 중 HttpContext.Current반환 null). 나는 알고 HttpContextWrapper있지만 잘못된 길을 간다.

답변:


249

가장 간단한 방법은 응용 프로그램을 가져 와서 속성을 ApplicationInstance사용하는 것입니다 Context.

// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;

( 의견에 이것을 언급 한 Ishmael Smyrnow 에게 감사드립니다 )

원래 답변 :

특히 처리 한 HttpContextBase인스턴스가 HttpContextWrapper런타임 에 유형 인 경우 특히 가능합니다 . 다음 예제는이를 수행하는 방법을 보여줍니다. Foo컨텍스트를 HttpContextBase다음 과 같이 받아들이 는 메소드 가 있지만 컨텍스트를 다음 과 같이 입력 해야하는 타사 어셈블리에서 메소드를 호출해야합니다 HttpContext.

void Foo(HttpContextBase context) 
{
    var app = (HttpApplication) context.GetService(typeof(HttpApplication));
    ThirdParty.Bar.Baz(app.Context);
}

// Somewhere in assembly and namespace ThirdParty,
// in a class called Bar, there is Baz expecting HttpContext:

static void Baz(HttpContext context) { /* ... */ }

HttpContextBaseGetService지원의 결과로 호출되는 메소드 가 있습니다 IServiceProvider. 랩핑 된 인스턴스 의 구현에 대한 대리자 의 GetService재정의 . 의 구현을 통해 , 등의 일반적인 용의자를 쿼리 할 수 ​​있습니다 . Context 라는 속성이 있고 의 인스턴스를 반환하는 경우에도 마찬가지 입니다 . 그래서 하나는 포장에 도착 물어 예를 위해 를 통해 판독 한 다음 반환의 자산 인스턴스를.HttpContextWrapperGetServiceHttpContextGetServiceHttpContextHttpApplicationHttpRequestHttpResponseHttpApplicationHttpContextHttpContextHttpContextBaseHttpApplicationGetServiceContextHttpApplication

달리 HttpContextBase, GetService의 공용 멤버로 표시되지 않습니다 HttpContext하지만 때문이다 HttpContext구현을 IServiceProvider.GetService명시 적으로있는 동안은 HttpContextBase하지 않습니다.

마음에 곰 Foo이 수있는에 의존하기 때문에 더 이상 검증하지 않습니다는 기본 랩을 해제하기 위해 HttpContext테스트 중에 첫 번째 장소에서 가짜 / 스텁에 거의 불가능하다. 그러나이 답변의 요점은 "HttpContextBase에서 HttpContext 객체를 어떻게 얻습니까?"라는 질문을 말 그대로 해결하는 것 입니다. 설명 된 기술은 수정해야 할 요소가없는 구성 요소 사이에 끼어있는 상황에서 유용합니다.


3
매우 흥미로운 대답은 MVC에서 직접 사용하여 로깅을 위해 HttpContext를 오류 필터에서 ELMAH로 전달하는 것입니다.
Chris Marisic

1
좋은 대답, 내기 조금 파고 들었다? :)
longhairedsi

좋은 답변입니다! 나는 특히 내 ELMAH MVC에 컨트롤러에서 그 활용 github.com/alexanderbeletsky/elmah.mvc.controller/blob/master/...
알렉산더 Beletsky

35
HttpContextBase를 사용하면 호출 할 수 context.ApplicationInstance.Context없습니까?
Ishmael Smyrnow

@IshmaelSmyrnow 젠장,에 Http*Base의해 반환 된 모든 변형 중에서 그것을 놓친 방법은 없습니다 HttpContextBase. : P 답변을 업데이트하겠습니다.
Atif Aziz

32

넌 할 수있어

var abstractContext = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);

16
-1 이것은 잘못된 방법입니다. 컨텍스트가있을 때베이스를 제공합니다.
Chris Marisic

14

당신은 할 수 없습니다.

전체적인 목적은 HttpContextBase구체적 HttpContext클래스 에 대한 의존성을 추상화하는 것 입니다. 그 동안 콘크리트를 포함 HttpContext (의 경우와 같은 httpContextWrapper) 다른 구현과는 절대적으로 아무것도 할 수있다 HttpContext.

가장 좋은 방법은 HttpContextBase콘크리트 HttpContext를 항상로 포장 할 수 있으므로 사용자를위한 맞춤 추상 팩토리를 정의하는 것 HttpContextWrapper입니다.


12
그건 그렇고, 끔찍하게 이루어졌습니다-단위 테스트를 설정하고 싶다는 것을 이해하고 추상화 계층을 이해합니다.하지만 HttpContext를 기대하는 기존 ASP.NET 클래스를 사용하려면 WTH를 사용해야합니까? ( msdn.microsoft.com/en-us/library/… 와 같은 )
marq

그러나 IHttpHandler구현 을 테스트 하려면 단위 테스트를 위해 (응답 래퍼)에 많은 수의 추상화를 넣어야합니다. 이는 옳지 않지만 유일한 옵션입니다.
Chris S
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.