使用ASP.NET ReportView时,为什么HttpContext.Current有时会为null?

时间:2012-10-09 01:50:27

标签: c# asp.net reportviewer httpcontext reportviewer2008

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

我们遇到了这个间歇性问题,在HttpContext.Current控件的调用过程中null属性为ReportViewer。有时它是null,有时则不是。登台网站与开发机器的行为可能不同,甚至在不同的开发机器之间也有所不同。

这将导致想要使用我们的服务的报告抛出异常。

为什么HttpContext.Current属性null

为什么会断断续续?

1 个答案:

答案 0 :(得分:2)

问题的根源似乎是Report Viewer有时使用线程池线程来检索报告中定义的DataSet的数据。线程池线程无法访问为HTTP请求提供服务的线程的HttpContext.Current实例(more information in this blog post)。

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

似乎没有任何方法可以预测或控制在第一个之后检索DataSet的线程。