문제

싱글 톤 패턴을 사용하는 내 자신의 ApplicationContext 클래스를 묵상하고 있습니다. 요청의 모든 부분에서 액세스 할 수 있으므로 httpcontext.items에 인스턴스를 저장하고 싶습니다. ASP.NET MVC와 함께 httpcontext를 사용하는 것에 대해 읽었으며 주요 통증 중 하나는 테스트 복잡성을 도입한다는 것입니다. httpcontext.items의 테스트 가능성에 대한 연구를 시도했지만 세션에 대한 내용 만 찾을 수 있습니다. 내가 찾은 유일한 것 중 하나는 WROX의 Professional ASP.NET 3.5 MVC 책의 샘플 장에서 나온 것입니다.PDF 링크). 15 페이지에는 다음과 같습니다.

사용할 수없는 것 : httpcontext.items
이 섹션에서 우리는 깨끗하게 와서 우리가 당신에게 거짓말을했다고 말했습니다. 그 결과 httpcontext.items 컬렉션을 사용하여 비트의 데이터를 저장하고 검색 할 수 없습니다.

그 이유는 일단 컨트롤러로 리디렉션되면 httphandler가 httpcontext.current의 고유 한 정의를 갖는 httpcontextWrapper를 사용하여 생성 된 System.web.mvc.mvchandler가되기 때문입니다. 불행히도,이 악수 중에 httpcontext.items와 같은 것들이 전송되지 않습니다.

이것이 요약 된 것은 HTTPContext 유형이 거의 동일하게 보이고 소리를 내더라도 동일하지 않으며 이런 식으로 데이터를 전달할 수 없다는 것입니다.

이제 이것을 테스트하려고 시도했는데, 알 수있는 한, redirecttoaction을 사용하여 다른 컨트롤러로 리디렉션하는 경우 httpcontext.items가 남아 있습니다. 기본 ASP.NET MVC 프로젝트를 사용하여이를 테스트하고 있습니다. 내가 한 것은이 방법을 Global.asax.cs에 추가하는 것입니다.

protected void Application_BeginRequest()
{
    Context.Items["Test"] = "Hello World";
}

그리고 HomeController.cs에서는 색인 메소드를 다음으로 변경했습니다.

public ActionResult Index()
{
    return RedirectToAction("About");
}

정보에 대한 방법을 다음으로 변경했습니다.

public ActionResult About()
{
    Response.Write(Convert.ToString(HttpContext.Items["Test"]));
    return View();
}

응용 프로그램을 실행하면 페이지가 /home /about 및 response로 올바르게 리디렉션됩니다. global.asax.cs에 설정된 올바른 "Hello World"문자열을 작성합니다.

따라서 "httpcontext.items와 같은 것들이 전송되지 않는 것"이라고 말할 때이 책이 무엇을 의미하는지 이해하지 못하는 것처럼 보이거나 httpcontext.items를 사용해도 괜찮습니다.

httpcontext.items를 피하는 것이 좋습니다. 요청 당 요청에 따라 객체를 저장하는 또 다른 대안적인 방법이 있습니까?

도움이 되었습니까?

해결책

당신의 질문은 몇 가지를 묻는 것이지만 항목 #1은 당신이 찾고있는 답이라고 생각합니다.

  1. 사용하는 것이 좋습니다 Context.Items 요청 기준에 따라 캐싱? 예. 프로세스 중, 요청 당, 웹 팜의 기계 당 귀하의 기준이면 Context.ITEMS가 제공합니다.

  2. ~이다 Context.Items 테스트하기 어렵습니까? 테스트 가능성까지는 숨길 것입니다 Context.Items 어떤 종류의 인터페이스 뒤에. 이렇게하면 참조없이 단위 테스트 기능을 얻을 수 있습니다. Context.Items 곧장. 그렇지 않으면 무엇에 대해 테스트해야합니까? Context.Items? 프레임 워크가 값을 저장하고 검색 할 것인가? 코드를 무지하게 유지하십시오 System.Web 그리고 당신은 행복한 야영자가 될 것입니다.

  3. 할 것이다 Context.Items 생존하다 RedirectToAction? 아니요. 테스트가 유효하지 않습니다. 모든 웹 요청에서 "Hello, World"를 설정하고 테스트는 두 개의 웹 요청에 걸쳐 있습니다. 첫 번째는 인덱스 동작이 호출되는 시점입니다. 두 번째는 언제입니다 RedirectToAction 행동을 (HTTP 302)라고합니다. 실패하기 위해 인덱스 조치에서 새 값을 설정하고 About Action에 유지되는지 확인하십시오.

다른 팁

tempdata 사전을 사용하십시오. 주로 rections 사이에 객체를 저장하는 것입니다.

public ActionResult Index()
{
    TempData.Add("Test", "Hello world");
    return RedirectToAction("About");
}

public ActionResult About()
{
    ViewData["Test"] = TempData["Test"];
    return View();
}

그런 다음 귀하의 견해에서 값을 검색하십시오.

<%=ViewData["Test"] %>

나는 테스트를했고 TempData는 실제로 세션 상태 장애인으로 폭발합니다. 저의 유일한 조언은 객체 자체를 임시 데이터에 저장하지 않고 제안 된대로 간단한 유형 필드를 저장하는 것입니다. 객체 트리를 직렬화하지 않기 때문에 프로세스가없는 성능에 큰 영향을 미치지 않아야합니다.

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