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

标签 c# asp.net-mvc asynchronous structuremap

我试图在 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/

相关文章:

python - 如果在异常后不重置,ContextVar 会在异步逻辑中泄漏内存吗?

c# - case 标签的顺序对 switch 语句的效率有多大影响?

c# - 在 UserControl 中居中标签

c# - simplemembership MVC4 通过 userId 获取用户名

asp.net-mvc - Asp.Net Mvc 4 源代码?

variables - TypeScript 'let' 变量和异步调用

c# - Xunit 测试自定义消息的 IHttpActionResult Web api 2 函数

asp.net-mvc - Asp.Net MVC2 RenderAction 更改页面 mime 类型?

c# - MVC 架构中的业务逻辑放在哪里?

asp.net - AspNet同步上下文