2010-06-30 846 views
1

一些快速细节:ASP.NET会话已过期 - 事件ID 1309

我在IIS6上运行ASP.NET 4.0.30319.0。我一直在托管一个包含ReportViewer的网站,现在已经有一段时间了(大约3年)。在四月份,我升级到4.0运行时,并且事情平稳运行了几个月。

现在,我突然开始在托管ReportViewer的页面上看到相当多的会话超时异常。事件查看器记录了许多这些事件,并且实际上能够查看页面时,事件查看器碰撞或错过。点击页面一次,您可以看到生成的报告。刷新,并发生错误。再次刷新,它返回...

我已经搜查了很多论坛试图找出问题 - 大多数似乎建议更改SQL服务器设置(我不使用),更改AsyncRendering =“False”,更改应用程序池设置或超时。我不愿意改变其中的任何一种,因为它仅在一周前运作过,没有这个问题。

一个Windows更新的短,或者有人进行更改到服务器,而无需我的知识,我的想法......

更新

我试图增加最大虚拟内存,在应用程序池中,这不起作用。

+0

您使用inProc,状态服务器还是sql支持的会话? – chris 2010-06-30 16:07:16

+0

单个Web服务器或农场?它仅在生产中发生吗?粘性会话?你使用缓存吗? – 2010-06-30 21:24:18

+0

使用inProc,并且该应用程序位于单个Web服务器上。存储在会话中的所有信息都是用户的身份验证状态 - 不包含大量数据,否则。 – AlishahNovin 2010-06-30 22:11:56

回答

1

升级到.NET 4.0和Report Viewer 2010后,我遇到了几乎相同的问题。我同时进行了两次升级,现在我不知道应该责怪谁。在我的情况下,刷新确实有效,但用户在夜间保持打开页面,然后在第二天早上点击刷新,当会话已经丢失时。我们的应用程序池每晚都会回收。

我相信报告查看器应该保持会话存活,但事实并非如此。报表查看器中没有任何请求。当会话结束时,会话失效或应用程序回收会丢失它的存储状态。我也在使用InProc,我试图改变它,但报告查看器不能与状态服务器一起使用。稍后我会再试一次,从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()); 
       } 
      } 
     }