【问题标题】:HttpContext becomes NULL in TasksHttpContext 在任务中变为 NULL
【发布时间】:2015-04-27 09:08:22
【问题描述】:

我为 HttpContext 创建扩展方法。该方法生成pdf文件。

public static Task GeneratePdfTask(this HttpContext context, string path, int submissionId, string pdfName, Action<int, byte[]> postAction = null)
    {
        var local = context;
        return Task.Factory.StartNew(() =>
        {
            HttpContext.Current = local;
            SessionHelper.Set(SessionKey.IsPdfRendering, true);
            var pdfFile = new PdfGenerator().Generate(path, pdfName, submissionId);
            if (postAction != null && pdfFile != null)
            {
                postAction(submissionId, pdfFile);
            }
        });
    }

有时此会话 (HttpContext.Current) 变为 NULL,我得到异常。但不知道为什么。为 Session 创建扩展有一些限制吗?也许还有其他解决方案如何安全地使用当前会话?

【问题讨论】:

  • 为什么是Task.Factory.StartNew 而不是Task.Run?您是在 .NET 4.0 还是 4.5 中工作? 4.5 修复了在异步 ASP.NET 中配置 HTTP 上下文的几个问题
  • @PanagiotisKanavos,.NET 4.5.1

标签: c# asp.net asynchronous task httpcontext


【解决方案1】:

您不能同时使用来自多个线程的 HTTP 请求对象,所以这个问题没有实际意义。显式传递要跨线程移动的数据。

解释你所看到的:HttpContext.Current 依赖于当前线程(实际上它是逻辑调用上下文)。不要将其设置为某个值。你现在已经劫持了一些无辜的无关线程池线程的HttpContext.Current。您现在可能会发现不同的 HTTP 请求开始交互。这些是很难找到且令人讨厌的错误。

【讨论】:

  • 感谢您的回复。好的,这似乎是解决方案(您的建议),但请告诉我发送 cookie 集合作为参数是否是好的做法?
  • 否,因为该对象不是线程安全的。几乎没有 ASP.NET 对象。只有那些记录在案的线程安全。在请求线程上提取必要的 cookie 信息并传递它。
猜你喜欢
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
相关资源
最近更新 更多