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

时间:2011-09-15 23:12:42

标签: c# asp.net-mvc asynchronous structuremap

我正在尝试在MVC控制器中启动一个长时间运行的进程,然后立即返回给用户,以便他们可以启动另一个长时间运行的进程。我会看看通过ajax做这个,但我确实需要从物理机器读取一些值,然后再允许它们继续,这需要不到0.3秒。唯一的问题是Task中的方法从Session中读取不再可用的值。有没有办法创建一个具有用户Session值的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();

这是读取Session时发生错误的地方(SessionWrap只读取Session中的值)

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

1 个答案:

答案 0 :(得分:4)

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