Skip to main content
 首页 » 编程设计

c#之如何从 MVC3 中的后台任务访问 session (StructureMap)

2024年02月23日36unruledboy

我试图在 MVC Controller 中启动一个长时间运行的进程,然后立即返回给用户,以便他们可以启动另一个长时间运行的进程。我会考虑通过 ajax 执行此操作,但我确实需要从物理机读取一些值,然后才能让它们继续运行,这需要不到 0.3 秒的时间。唯一的问题是任务中的方法从不再可用的 session 中读取值。有没有办法创建一个 HttpContext,它具有用于 StructureMap 的用户 session 值?

下面是任务

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; 
            }); 

请您参考如下方法:

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