代码之家  ›  专栏  ›  技术社区  ›  makstaks

当httpContext返回空值时,如何检索该属性?

  •  22
  • makstaks  · 技术社区  · 16 年前

    我在一个单独的线程上执行一些异步工作,使用:

    ThreadPool.QueueUserWorkItem()
    

    在这个单独的线索中,我需要 HttpContext.Current 以便我可以访问:

    HttpContext.Current.Cache  
    HttpContext.Current.Server  
    HttpContext.Current.Request  
    

    然而, httpContext.current当前 当我创建这个单独的线程时为空。

    问题

    如何创建一个新线程以便 httpContext.current当前 不是空的吗?或者有其他方法可以访问缓存、服务器和请求对象吗?

    6 回复  |  直到 16 年前
        1
  •  14
  •   Ed Schwehm    12 年前

    我尽量不保存对依赖于ASP.NET堆栈的对象(如httpContext)的引用。如果您需要在不同的线程中做一些工作,那是因为您不想在ASP.NET线程中等待任务完成。也许请求/上下文/会话是在线程没有终止的情况下终止的。

    您应该传递一个具有线程所需数据的对象。

        2
  •  36
  •   Tamas Czinege    16 年前

    您可以使用 httpruntime.缓存 即使您没有httpContext,但不幸的是您无法访问服务器或请求。

    如果你考虑一下,这是有意义的-你没有提供任何页面,所以你没有一个请求。

        3
  •  3
  •   TRR    13 年前

    1-添加底部代码 <system.serviceModel> 在web.config文件中:

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    

    2-在Web服务文件中的命名空间后添加底部代码:

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    

    3-重建Web部件项目。 完成!

    reference

        4
  •  1
  •   Andrei Rînea    16 年前

    对于httpContext.server服务,可以使用httpServerUtility类。 对于缓存,您可以使用httpruntime.cache,如上所述。 对于请求对象,可以在创建时将数据从请求传递到线程。例如request.querystring或request.form…或者什么。

        5
  •  1
  •   Andy Johnson    15 年前

    有一个线程池实现 here 它提供调用线程的HTTP上下文的传播。我还没用过,但我打算用。

        6
  •  0
  •   Chuck Conway    16 年前

    如果单独的线程试图访问这些对象,那么它们将为空。这些对象的作用域在线程级别。如果要在新线程中使用它们,则必须将它们传递到需要它们的方法/类中。

    通常ASP.NET不允许生成新线程…这里是一个 post 关于这个问题。

    这是一篇好文章 threading in ASP.NET from MSDN .