当HttpContext返回null时,我该如何检索其属性?

22

我正在使用以下方式在单独的线程上进行一些异步工作:

ThreadPool.QueueUserWorkItem()

在这个独立的线程中,我需要调用 HttpContext.Current 来访问:

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

然而,当我创建这个单独的线程时,HttpContext.Current是空的。

问题

我如何创建新线程,以便HttpContext.Current不为空?或者是否有其他方法可以访问Cache、Server和Request对象?

6个回答

37

即使没有HttpContext,您仍然可以使用HttpRuntime.Cache访问ASP.NET缓存,但不幸的是,您无法访问Server或Request。

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


很好了解,这正是我需要解决我的难题的,谢谢! - MrBoJangles
点赞!(Y)。HttpRuntime.Cache 帮助我节省了很多时间。谢谢。 - Zain Shaikh
1
请参阅HostingEnvironment以获取面向服务器的调用(例如HostingEnvironment.MapPath)。 - ladenedge

14

我会尽量避免保留依赖于 ASP.NET 栈(例如 HttpContext)的对象的引用。如果需要在不同的线程中完成一些工作,这是因为您不想等待 ASP.NET 线程完成任务。而且,可能在您的线程未完成时 Request/Context/Session 已被终止。

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


3

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

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

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

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

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

参考链接


1

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


1

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


3
要在 Web 请求之外启动 HttpServerUtility 的实例,请使用以下代码: new HttpApplication().Server (来源:http://britishinside.com/archive/2005/08/20/HttpServerUtility.aspx)然而,某些功能可能无法正常工作,例如 Server.MapPath。但是,可以通过使用 System.Web.Hosting.HostingEnvironment.MapPath 来解决此问题。 - Jon Adams

0

如果独立线程正在尝试访问这些对象,那么它们将为 null。这些对象的作用域仅限于线程级别。如果您想在新线程中使用它们,您必须将它们传递到需要它们的方法/类中。

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

这是一篇关于MSDN 上的 ASP.NET 线程处理 的好文章。


1
在ASP.Net中不创建线程的帖子并没有说什么。它只是简单地指出你不应该使用线程池来创建线程,而应该自己管理它们。 - Kibbee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接