在我们的ASP.NET Web应用程序中,我们有一个具有生命周期/范围的服务,可以描述为“每个请求的实例”,即实例存储在HttpContext.Current.Items
集合中。
我们遇到了这个间歇性问题,在HttpContext.Current
控件的调用过程中null
属性为ReportViewer
。有时它是null
,有时则不是。登台网站与开发机器的行为可能不同,甚至在不同的开发机器之间也有所不同。
这将导致想要使用我们的服务的报告抛出异常。
为什么HttpContext.Current
属性null
?
为什么会断断续续?
答案 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的线程。