2011-09-15 4 views
0

MVC 컨트롤러에서 장기 실행 프로세스를 시작한 다음 즉시 사용자에게 반환하여 다른 장기 실행 프로세스를 시작할 수 있습니다. 나는 아약스를 통해이 작업을 수행 할 것입니다.하지만 실제 시스템에서 값을 읽어야 만 3 초 이내에 작업을 계속할 수 있습니다. 유일한 문제는 작업의 메서드가 더 이상 사용할 수없는 세션의 값을 읽는 것입니다. StructureMap과 함께 사용할 사용자 세션 값을 가진 HttpContext를 만드는 방법이 있습니까?MVC3 (StructureMap)의 백그라운드 작업에서 세션에 액세스하는 방법

아래는 작업

System.Threading.Tasks.Task async = new System.Threading.Tasks.Task(() => 
      { 
       var response = service.LongRunningTask(request, weight); 
       this.requestCache.Insert("someKey", 120, response); 
      }); 
     async.Start(); 

되고 세션이 읽을 때 오류가 일어나는 곳이다

 registry.For<IPrintService>().HybridHttpOrThreadLocalScoped().Use(() => 
      { 
       var profiler = ServiceLocatorManager.Current.Resolve<IProfiler>(); 
        return new PrintService(AppSettings.PrintDirectly, SessionWrap.UseLabelPrinter, SessionWrap.UsePrinter, profiler) as IPrintService; 
      }); 
+0

IoC 컨테이너에서 IPrintService를 요청하는 방법은 무엇입니까? – StriplingWarrior

+0

다른 클래스에 삽입 된 생성자 인수를 통해 요청됩니다. –

+0

다른 클래스는 무엇입니까? 내가 묻는 이유는 순수한 생성자 삽입을 사용하고 있다면 컨트롤러가 생성 될 때 바인딩 메소드가 실행될 것이고'service.LongRunningTask'를 호출 할 때가 아니라는 것이다. 따라서 SessionWrapper에 액세스하는 것은 작업이 생성되기 전에 발생합니다. – StriplingWarrior

답변

3

(SessionWrap 단지 세션에서 값을 읽어) 당신은 어떤 접근해서는 안 HttpContext는 Request, Response, Session ... 등의 내장 객체를 백그라운드 작업에서 사용하기 때문에 작업이 실행될 때 오랫동안 사라 졌을 수 있습니다. 이 작업에 필요한 모든 정보를 일부 모델 클래스 내에 집계하여 실행하기 전에 작업에 전달할 수 있습니다. 이렇게하면 작업에 필요한 모든 것이 생기므로 HttpContext에 액세스 할 필요가 없습니다.

관련 문제