문제

이것은 컨트롤러를 사용하는 올바른 방법이 아닐 수도 있지만,이 문제를 발견했으며이를 수정하는 방법을 찾지 못했습니다.

public JsonResult SomeControllerAction() {

    //The current method has the HttpContext just fine
    bool currentIsNotNull = (this.HttpContext == null); //which is false    

    //creating a new instance of another controller
    SomeOtherController controller = new SomeOtherController();
    bool isNull = (controller.HttpContext == null); // which is true

    //The actual HttpContext is fine in both
    bool notNull = (System.Web.HttpContext.Current == null); // which is false        

}

컨트롤러의 httpcontext는 System.web.httpcontext.current에서 찾을 수있는 "실제"httpcontext가 아닙니다.

컨트롤러에 HTTPContextBase를 수동으로 채울 수있는 방법이 있습니까? 아니면 컨트롤러 인스턴스를 만드는 더 나은 방법?

도움이 되었습니까?

해결책

컨트롤러는 당신이하는 것처럼 수동으로 만들어 지도록 설계되지 않았습니다. 그것은 당신이 실제로해야 할 일이 당신이 가지고있는 재사용 가능한 논리를 대신에 도우미 수업에 넣는 것 같습니다.

다른 팁

지금은 다음을 수행 할 것입니다. 이것은 허용 가능한 수정 인 것 같습니다 ...

public new HttpContextBase HttpContext {
    get {
        HttpContextWrapper context = 
            new HttpContextWrapper(System.Web.HttpContext.Current);
        return (HttpContextBase)context;                
    }
}

여기서 컨트롤러 클래스에 추가되는 경우이 컨트롤러는 상속됩니다.

httpcontext가 null이 원하는 동작인지 확실하지 않지만 그 동안이를 고칠 것입니다.

컨트롤러 텍스트의 httpcontext는 컨트롤러가 만들어지면 설정되지 않기 때문에 NULL입니다. 컨트롤러의 대조 업체는이 속성을 할당하지 않으므로 NULL이됩니다. 일반적으로 HTTPContext는 ControllerBuilder 클래스의 HTTPContext로 설정됩니다. 컨트롤러는 ControllerBuilder 클래스에 의해 생성되며 DefaultControllerFactory가 이어집니다. 컨트롤러의 고유 한 인스턴스를 만들려면 컨트롤러의 ExecuteMethod를 자신의 ControlLerContext로 사용할 수 있습니다. 당신은 그렇게하고 싶지 않습니다. 실제 응용 프로그램입니다. 프레임 워크에 대한 경험을 더 많이 받으면 원하는 적절한 방법을 찾을 수 있습니다. 단위 테스트에서 ControlLerContext가 필요한 경우 조롱 프레임 워크를 사용하여 ControlLerContext를 조롱하거나 수업을 할 수 있습니다.

ASP.NET MVC에서 요청 흐름 모델을 찾을 수 있습니다. 이 블로그.

ASP.NET MVC를 처음 접하는 경우 소스 코드를 다운로드하고 요청 처리 방법을 추적하는 것이 좋습니다.

컨트롤러에서 일부 기능을 사용하고 싶습니까? 아니면 컨트롤러가 작업을 수행 했습니까?

전자라면 아마도 다른 클래스로 나뉘어야 할 코드 일 것입니다. 후자라면 해당 컨트롤러가 특정 조치를 취하도록하기 위해이 작업을 수행 할 수 있습니다.


return RedirectToAction("SomeAction", "SomeOtherController", new {param1 = "Something" });

컨트롤러 공장을 사용하고 있습니까? 그렇다면 구성 요소를 어떻게 등록하고 있습니까?

나는 윈저의 일시적인 것이 아니라 싱글 톤으로서 HTTPContext 기반 종속성을 실수로 추가 한이 문제를 해결했다.

httpcontext는 첫 번째 요청을 제외한 모든 것에 대해 null이었습니다. 그 중 하나를 추적하는 데 시간이 걸렸습니다.

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