C# 为什么在使用ASP.NET ReportViewer时HttpContext.Current有时为空?

C# 为什么在使用ASP.NET ReportViewer时HttpContext.Current有时为空?,c#,asp.net,reportviewer,httpcontext,reportviewer2008,C#,Asp.net,Reportviewer,Httpcontext,Reportviewer2008,在我们的ASP.NET Web应用程序中,我们有一个服务,其生命周期/作用域可以描述为“每个请求的实例”,即实例存储在HttpContext.Current.Items集合中 在从ASP.NETReportViewer控件调用期间,HttpContext.Current属性为null时,我们遇到了这种间歇性问题。有时它是空的,有时它不是空的。与开发人员机器相比,登台网站上的行为可能有所不同,甚至在不同的开发人员机器之间也有所不同 这将导致希望使用我们的服务的报告抛出异常 为什么HttpConte

在我们的ASP.NET Web应用程序中,我们有一个服务,其生命周期/作用域可以描述为“每个请求的实例”,即实例存储在
HttpContext.Current.Items
集合中

在从ASP.NET
ReportViewer
控件调用期间,
HttpContext.Current
属性为
null
时,我们遇到了这种间歇性问题。有时它是空的,有时它不是空的。与开发人员机器相比,登台网站上的行为可能有所不同,甚至在不同的开发人员机器之间也有所不同

这将导致希望使用我们的服务的报告抛出异常

为什么
HttpContext.Current
属性
null


为什么是间歇性的

问题的根源似乎是报表查看器有时使用线程池线程来检索报表中定义的数据集的数据。线程池线程无法访问为HTTP请求()提供服务的线程的
HttpContext.Current
实例

我场景中的报告在报告定义中有许多数据集,每个数据集对应于页面上定义的
ObjectDataSource
。经过广泛的调试后,我发现报表将在为HTTP请求提供服务的同一线程上检索报表定义中声明的第一个数据集的数据。任何后续数据集都将在主HTTP请求线程或线程池线程上检索。然后,这些后续的数据集将间歇性地抛出异常,说明
HttpContext.Current
为null


似乎没有任何方法可以预测或控制在第一个线程之后将在哪个线程上检索数据集。

有人找到了这个问题的答案吗?我发现它总是空的,这意味着我不能使用HttpContext.Current.ResolveUrl。我也不能使用System.Web.VirtualPath实用性.ToAbsolution,因为这会引发类型初始化异常.Hi。您可能遇到与从主HTTP请求服务线程以外的线程访问HttpContext.Current时相同的问题。看看我链接到的博客帖子。谢谢。我看到这篇博客文章提出了一个非常重要的观点,我一直在努力实现这一点,即我的报表对象类不应该依赖于ASP.Net机器,因此我们无法访问HttpContext.Current,但这没关系,因为我们不应该尝试访问它。否则,我无法在web窗体应用程序中使用我的报表。