如何从MVC3 (StructureMap)中的后台任务访问会话

本文关键字:后台任务 访问 会话 StructureMap MVC3 | 更新日期: 2023-09-27 18:08:38

我试图在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;
            });

如何从MVC3 (StructureMap)中的后台任务访问会话

你不应该访问任何HttpContext的内部对象,比如Request, Response, Session,…在后台任务中,因为当任务执行时,它们可能早就消失了。您可以在某个模型类中聚合此任务所需的所有信息,并在运行之前将其传递给任务。这样,任务将拥有它所需要的一切,并且不需要访问HttpContext。