我试图在 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。
关于c# - 如何从 MVC3 中的后台任务访问 session (StructureMap),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7438510/