1

一些快速的细节:

我在 IIS6 上运行 ASP.NET 4.0.30319.0。我托管一个包含 ReportViewer 的网站已经有一段时间了(大约 3 年)。4 月,我升级到 4.0 运行时,顺利运行了几个月。

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

我搜索了许多论坛试图找出问题 - 大多数似乎建议更改 SQL 服务器设置(我没有使用)、更改 AsyncRendering="False"、更改应用程序池设置或超时。我不愿意更改任何这些,因为它仅在一周前起作用,没有这个问题。

缺少 Windows 更新,或者有人在我不知情的情况下更改服务器,我没有想法......

更新

我尝试在应用程序池中增加最大虚拟内存,但没有成功。

4

1 回答 1

1

在升级到 .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());
                }
            }
        }
于 2010-08-02T08:24:19.947 回答