Как получить доступ к сеансу из фоновой задачи в MVC3 (StructureMap) - PullRequest
1 голос
/ 16 сентября 2011

Я пытаюсь запустить длительный процесс в контроллере MVC, а затем немедленно вернуться к пользователю, чтобы он мог запустить другой длительный процесс. Я хотел бы взглянуть на это через ajax, но мне нужно прочитать некоторые значения с физической машины, прежде чем позволить им продолжить, что занимает менее 0,3 секунды. Единственная проблема состоит в том, что метод в Задаче считывает значения из Сессии, которая больше не доступна. Есть ли способ создать HttpContext, который имеет значения сеанса пользователей для использования с 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();

И именно здесь происходит ошибка при чтении сеанса (SessionWrap просто читает значение из сеанса)

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

1 Ответ

4 голосов
/ 16 сентября 2011

Вы не должны обращаться к каким-либо внутренним объектам HttpContext, таким как Request, Response, Session, ... в фоновых задачах, просто потому, что они могут долго отсутствовать при выполнении задачи. Вы можете собрать всю информацию, которая понадобится этой задаче, в некотором классе модели и передать ее задаче перед выполнением. Таким образом, у задачи будет все, что ей нужно, и не потребуется доступ к HttpContext.

...