在升级到 .NET 4.0 和 Report Viewer 2010 之后,我遇到了几乎相同的问题。我同时进行了两次升级,现在我不确定是谁的错。就我而言,刷新确实有效,但用户在夜间保持页面打开,然后在第二天早上单击刷新,此时会话已经丢失。我们的应用程序池每晚都会回收。
我相信报告查看器应该使会话保持活动状态,但事实并非如此。报表查看器没有任何类型的请求。然后,当会话结束时,它会丢失其存储的状态,无论是会话到期还是应用程序回收。我也在使用 InProc,我尝试更改它,但报表查看器无法与 State Server 一起使用。我稍后会再试一次,以远离 InProc。
请参阅我的类似问题。
我还没有将它投入生产,但我为带有报告的 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());
}
}
}