如何在返回null时检索HttpContext属性?

时间:2009-02-09 18:30:11

标签: asp.net httpcontext

我正在使用以下单独的线程进行异步工作:

ThreadPool.QueueUserWorkItem()

在这个单独的主题中,我需要调用HttpContext.Current以便我可以访问:

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

但是,当我创建这个单独的线程时,HttpContext.Current为null。

问题

如何创建新线程以使HttpContext.Current不为空?或者是否有另一种方法可以访问Cache,Server和Request对象?

6 个答案:

答案 0 :(得分:36)

即使您没有HttpContext,也可以使用 HttpRuntime.Cache 访问ASP.NET缓存,但遗憾的是您无法访问服务器或请求。

如果您考虑一下,这是有道理的 - 您没有提供任何页面,因此您没有请求。

答案 1 :(得分:14)

我尝试不要像HttpContext那样持有对依赖ASP.NET堆栈的对象的引用。如果你需要在不同的线程中做一些工作,那是因为你不想在ASP.NET中等待,直到你的任务完成。也许请求/上下文/会话在您的线程不是时终止。

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

答案 2 :(得分:3)

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

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

2-在Web服务文件中的NameSpace之后添加底部代码:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

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

reference

答案 3 :(得分:1)

对于HttpContext.Server服务,您可以使用HttpServerUtility类。 对于Cache,您可以使用HttpRuntime.Cache,如上所述。 对于请求对象,您可以在创建时将数据从请求传递给线程。像Request.QueryString或Request.Form ......等等。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

通常,ASP.Net不允许您生成新的线程......这里有一个post

这是threading in ASP.NET from MSDN的一个很好的写作。