문제

현재 요청의 HTTPContext 인스턴스를 복제하는 가장 쉬운 방법은 무엇입니까?

나는 앱을 개발하고있다 ASP.NET MVC V1. 나는 정기적 인 partialview 기능을 업그레이드하여 실제로 매우 유사하게 작동하지만 고유 한 컨텍스트가있는 하위 제어기를 갖도록했습니다. partialviews를 사용하면 기본보기의 컨트롤러 동작에서 부분보기에 대한보기 데이터를 채워야합니다. 보기 내에서 컨트롤러 작업을 호출 할 수 있도록 내 자신의 기능을 만들었습니다. 이렇게하면 내가 얻는다 :

  • Main View의 컨트롤러 작업에 하위 뷰의 데이터를 제공 할 필요가 없습니다.
  • 서브 컨트롤러 메소드는 다른 뷰/컨트롤러와 관련없이 데이터를 더 캡슐화 할 수 있습니다.

문제는 각 하위 컨트롤러 요청이 httpcontext를 사용한다는 것입니다. 따라서 하위 컨트롤러에 HTTPContext.Item을 설정하면 실제로 실제 요청의 httpContext를 채 웁니다.

그래서 httpcontext를 복제하고 싶은 이유입니다. 나는 이미 사용하고있다 :

HttpContext subContext = new HttpContext(request, response);
// what happened to Session, User, Items etc. properties?

그러나 이것은 요청과 응답 이외의 다른 것을 설정하지 않습니다. 그러나 나는 아마도 다른 속성과 컬렉션이 필요할 것입니다 ... 세션, 항목, 사용자 ... 등.

도움이 되었습니까?

해결책 2

불가능합니다

서버 세션 상태로 인해 실제 깊은 복제가 불가능하다고 생각합니다. 클로닝은 또한이 값을 복제해야합니다.이 값은 본질적으로 정적이며 복제 할 수없는 웹 서버 특정 내부 리소스입니다. 이 경우 웹 서버에는 예를 들어 여러 세션 객체가 있습니다.

해결 방법
그래도. 해결 방법은 하위 컨트롤러 처리를 인스턴스화하기 전에 추가 컨텍스트 값을 설정하는 것이 었습니다. 처리가 끝나면 값을 원본으로 되돌 렸습니다. 그래서 나는 실제로 이전과 마찬가지로 맥락을 가졌습니다.

다른 팁

"불가능한"대답은 정확하지만, 현재 컨텍스트에 값을 쓰고 원래 상태로 다시 작성하는 것보다 훨씬 깨끗한 대안이 있습니다. 해결책은 선택한 URL을 기반으로하는 새로운 HTTPContext 객체를 전적으로 만드는 것입니다.

// A new request/response is constructed to using a new URL.
// The new response is using a StreamWriter with null stream as a backing stream 
// which doesn't consume resources

using (var nullWriter = new StreamWriter(Stream.Null))
{
    var newRequestUri = new Uri("http://www.somewhere.com/some-resource/");
    var newRequest = new HttpRequest("", newRequestUri.ToString(), newRequestUri.Query);

    var newResponse = new HttpResponse(nullWriter);
    var newContext = new HttpContextWrapper(new HttpContext(newRequest, newResponse));

    // Work with the new context here before it is disposed...
} 

참조: https://github.com/maartenba/mvcsitematrovider/issues/278#issuecomment-34905271

ASP.NET MVC 프레임 워크는 의도적으로 모든 멤버 가상으로 추상 클래스에 종속성을 만듭니다. 그것은 단순히 - 확장 성이라고 말합니다.

컨트롤러는 httpcontext가 아닌 httpcontextbase에 의존합니다. 아마도 당신은 당신의 하위 컨트롤러가 httpcontextbase에 의존하게 만들 수 있도록하여 그것을 포장 할 수 있습니다. 내 2 센트.

나는 사용했다

<% Html.RenderAction("Action", "Controller"); %>

큰 효과를 위해, 복잡한 코드에 의지하지 않고 완전히 고립 된/탈출 된 동작을 만들 수 있습니다. 이것은 동일한 복잡성없이 동일한 기능을 제공하는 것 같습니다.

렌더링 된 뷰는 표준 부분 뷰와 컨트롤러 동작과 마찬가지로 컨트롤러 동작입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top