Asp.net 当HttpContext返回null时,如何检索它的属性?

Asp.net 当HttpContext返回null时,如何检索它的属性?,asp.net,httpcontext,Asp.net,Httpcontext,我正在使用以下工具在单独的线程上执行异步工作: ThreadPool.QueueUserWorkItem() 在这个单独的线程中,我需要调用HttpContext.Current,以便访问: HttpContext.Current.Cache HttpContext.Current.Server HttpContext.Current.Request 但是,当我创建这个单独的线程时,HttpContext.Current为空 问题: 如何创建一个新线程,使HttpContext.

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

ThreadPool.QueueUserWorkItem()
在这个单独的线程中,我需要调用
HttpContext.Current
,以便访问:

HttpContext.Current.Cache  
HttpContext.Current.Server  
HttpContext.Current.Request  
但是,当我创建这个单独的线程时,
HttpContext.Current
为空

问题:
如何创建一个新线程,使
HttpContext.Current
不为空?或者有其他方法可以访问缓存、服务器和请求对象吗?

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


如果您仔细想想,这是有意义的-您没有提供任何页面,因此您没有请求。

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

通常ASP.Net不允许生成新线程。。。这里有一个关于这个问题的报告


这是一篇很好的文章。

我尽量不保存对依赖于ASP.NET堆栈的对象(如HttpContext)的引用。如果您需要在不同的线程中执行某些工作,那是因为您不想在ASP.NET线程中等待任务完成。可能请求/上下文/会话在线程未终止时终止


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

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

有一个线程池实现,它提供调用线程的HTTP上下文的传播。我还没有使用它,但我计划使用。

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

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
3-重建web部件项目。 完成了


关于不在ASP.Net中创建线程的帖子没有这样的内容。它只是说明您不应该使用线程池来创建线程,您应该自己管理线程。要在web请求之外启动HttpServerUtility实例,请使用:new HttpApplication()。服务器(通过)某些功能将无法工作。例如,Server.MapPath没有。但作为一种解决方法,请使用System.Web.Hosting.HostingEnvironment.MapPath。很高兴知道,这正是我解决这个难题所需要的,谢谢!竖起大拇指!(Y) 。缓存帮助我节省了很多时间。还感谢面向服务器的调用(例如,
HostingEnvironment.MapPath
)。
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]