一些快速细节:
我在IIS6上运行ASP.NET 4.0.30319.0。我一直在托管一个包含ReportViewer的网站已经有一段时间了(〜3年)。 4月份,我升级到了4.0运行时,事情顺利进行了几个月。
现在,我突然开始看到在托管ReportViewer的页面上发生了很多会话超时异常。事件查看器记录了许多这些事件,当涉及到实际能够查看页面时,它非常受欢迎。点击一次页面,您可以看到生成的报告。刷新,并发生错误。再次刷新然后返回......
我已经搜索了很多论坛试图弄清楚这个问题 - 大多数似乎都建议更改SQL服务器设置(我没有使用),更改AsyncRendering =“False”,更改应用程序池设置或超时。我不愿意改变这些,因为它只在一周前工作,没有这个问题。
如果没有Windows Update,或者有人在我不知情的情况下对服务器进行了更改,我就没有想法......
更新
我已尝试在应用池中增加最大虚拟内存,但无效。
答案 0 :(得分:1)
升级到.NET 4.0和Report Viewer 2010后,我遇到了几乎相同的问题。我同时进行了两次升级,现在我不确定应该责怪谁。在我的情况下,刷新确实有效,但是用户在夜间保持页面打开,然后在会话已经丢失时点击第二天早上刷新。我们的应用程序池每晚都会循环使用。
我相信报告查看器应该保持会话活着,但事实并非如此。报告查看器中没有任何类型的请求。然后,当会话结束时,它会通过会话到期或应用程序回收而丢失它的存储状态。我也在使用InProc,我试图更改它,但报表查看器不能与State Server一起使用。我将在稍后再试一次,离开InProc。
查看我的类似question。
我还没有将它投入生产,但是我给aspx页面提供了一个自定义页面的报告,我会在那里查看会话是否实际超时。它基本上重新加载报告页面,而不是在预期会话的地方进行回发。
if (Context.Session != null)
{
//Tested and the IsNewSession is more advanced then simply checking if
// a cookie is present, it does take into account a session timeout, because
// I tested a timeout and it did show as a new session
if (Session.IsNewSession)
{
// If it says it is a new session, but an existing cookie exists, then it must
// have timed out (can't use the cookie collection because even on first
// request it already contains the cookie (request and response
// seem to share the collection)
string cookieHeader = Request.Headers["Cookie"];
if ((null != cookieHeader) && (cookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
{
Response.Redirect(Request.Url.ToString());
}
}
}