ASP.NET MVC 1의 HttpContextBase에서 HttpContext 개체를 얻는 방법은 무엇입니까?
일부 WebForms / MVC 불가지론 도구로 작업하고 HttpContext
있으며 HttpContextBase
객체에 대한 참조가 주어진 인스턴스를 가져와야 합니다. HttpContext.Current
비동기식으로도 작동해야 하기 때문에 사용할 수 없습니다 ( 비동기 요청 중 HttpContext.Current
반환 null
). 나는 알고 HttpContextWrapper
있지만 잘못된 길을 간다.
가장 간단한 방법은 응용 프로그램을 가져 와서 속성을 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) { /* ... */ }
HttpContextBase
GetService
지원의 결과로 호출되는 메소드 가 있습니다 IServiceProvider
. 랩핑 된 인스턴스 의 구현에 대한 대리자 의 GetService
재정의 . 의 구현을 통해 , 등의 일반적인 용의자를 쿼리 할 수 있습니다 . Context 라는 속성이 있고 의 인스턴스를 반환하는 경우에도 마찬가지 입니다 . 그래서 하나는 포장에 도착 물어 예를 위해 를 통해 판독 한 다음 반환의 자산 인스턴스를.HttpContextWrapper
GetService
HttpContext
GetService
HttpContext
HttpApplication
HttpRequest
HttpResponse
HttpApplication
HttpContext
HttpContext
HttpContextBase
HttpApplication
GetService
Context
HttpApplication
달리 HttpContextBase
, GetService
의 공용 멤버로 표시되지 않습니다 HttpContext
하지만 때문이다 HttpContext
구현을 IServiceProvider.GetService
명시 적으로있는 동안은 HttpContextBase
하지 않습니다.
마음에 곰 Foo
이 수있는에 의존하기 때문에 더 이상 검증하지 않습니다는 기본 랩을 해제하기 위해 HttpContext
테스트 중에 첫 번째 장소에서 가짜 / 스텁에 거의 불가능하다. 그러나이 답변의 요점은 "HttpContextBase에서 HttpContext 객체를 어떻게 얻습니까?"라는 질문을 말 그대로 해결하는 것 입니다. 설명 된 기술은 수정해야 할 요소가없는 구성 요소 사이에 끼어있는 상황에서 유용합니다.
넌 할 수있어
var abstractContext = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);
당신은 할 수 없습니다.
전체적인 목적은 HttpContextBase
구체적 HttpContext
클래스 에 대한 의존성을 추상화하는 것 입니다. 그 동안 수 콘크리트를 포함 HttpContext
(의 경우와 같은 httpContextWrapper
) 다른 구현과는 절대적으로 아무것도 할 수있다 HttpContext
.
가장 좋은 방법은 HttpContextBase
콘크리트 HttpContext
를 항상로 포장 할 수 있으므로 사용자를위한 맞춤 추상 팩토리를 정의하는 것 HttpContextWrapper
입니다.
'IT story' 카테고리의 다른 글
솔루션에서 nuget 패키지 복원을 제거 (0) | 2020.06.13 |
---|---|
C #에서 프로세스를 시작하려면 어떻게합니까? (0) | 2020.06.13 |
REST API-PUT DELETE POST GET을 사용하는 이유는 무엇입니까? (0) | 2020.06.13 |
bash 스크립트에서 정규 표현식으로 테스트를 어떻게 부정합니까? (0) | 2020.06.12 |
오염 된 캔버스는 내보낼 수 없습니다 (0) | 2020.06.12 |