从BackgroundWorker进程获取HttpContext

4
我有一个ASP.NET网站,最近对代码进行了重构以尝试从实际的http请求中删除一些长时间运行的进程(大约一个小时),方法是创建BackgroundWorker并将工作发送到其中进行处理。在缩减测试上运行良好,但当我将逻辑应用于真正的代码时,发现在后台工作器中运行的代码无法访问Session变量。似乎传递的HttpContext对象具有空会话,如果我要求HttpContext.Current,则返回null。

我认为这是因为它们在不同的线程中,而Session和HttpContext.Current都依赖于在相同的线程中。是否有任何方法可以从后台工作程序中访问Session,或者我必须找到所有需要的变量,将它们放入可用的数据结构中,然后在必要时将它们放回Session中(如果适用)?如果需要这样做,显然会使重构变得非常复杂,所以我宁愿不这样做。

感谢您提供的任何想法。除了BackgroundWorker进程(在另一个问题中建议给我的)之外,我也欢迎其他建议。

2个回答

1

我不确定你的所有要求,但如果您不需要将长时间进程绑定到单个用户请求上,您可以尝试使用应用程序缓存而不是会话。

如果是这样,我建议您尝试使用以下替代方案:

HttpRuntime.Cache.Set("CacheKeyName");
HttpRuntime.Cache.Get("CacheKeyName");

如果无法获取会话,那听起来像是一个明智的替代方式(我的方法本来都要涉及到方法参数)。 - Chris

1

这里有一个MSDN链接,可以帮助解决这个问题。具体来说:

如果异步操作方法调用了使用BeginMethod/EndMethod模式公开方法的服务,则回调方法(即作为异步回调参数传递给Begin方法的方法)可能在不受ASP.NET控制的线程上执行。在这种情况下,HttpContext.Current将为null,并且应用程序可能在访问AsyncManager类的成员(如Parameters)时遇到竞态条件。为确保您可以访问HttpContext.Current实例并避免竞争条件,您可以从回调方法中调用Sync()以恢复HttpContext.Current


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