【问题标题】:Microsoft ReportViewer: Session Expired ErrorsMicrosoft ReportViewer:会话过期错误
【发布时间】:2010-09-15 18:27:48
【问题描述】:

该项目是 ASP.NET 2.0,我自己从未能够重现此问题,但我收到电子邮件,通知我它每周多次发生在客户身上,通常是连续几次。

这是完整的错误:

异常详情:

Microsoft.Reporting.WebForms.AspNetSessionExpiredException:ASP.NET 会话已过期

堆栈跟踪:

[AspNetSessionExpiredException: ASP.NET 会话已过期] 在 Microsoft.Reporting.WebForms.ReportDataOperation..ctor() 在 Microsoft.Reporting.WebForms.HttpHandler.GetHandler() 在 Microsoft.Reporting.WebForms.HttpHandler.ProcessRequest(HttpContext 上下文) 在 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,Boolean& completedSynchronously) 会话对象:75de8e1d65ff40d1ba666d940af5b118:Microsoft.Reporting.WebForms.ReportHierarchy 5210064be1fa4d6abf5dd5e56b262974:Microsoft.Reporting.WebForms.ReportHierarchy

【问题讨论】:

    标签: session reportviewer


    【解决方案1】:

    我们遇到了同样的问题。到目前为止,我们只在会话过期时才发现它,但他们在进行积极缓存的浏览器中使用了后退按钮,这很好。但是即使主页没有,ReportViewer 也会尝试刷新。所以,我们只是添加了一些 hacky Global.asax 错误处理:

    protected void Application_Error(object sender, EventArgs e)
    {
        Exception exc = Server.GetLastError().GetBaseException();
        if (exc is Microsoft.Reporting.WebForms.AspNetSessionExpiredException)
        {
            Server.ClearError();
            Response.Redirect(FormsAuthentication.LoginUrl + "?ReturnUrl=" + HttpUtility.UrlEncode(Request.Url.PathAndQuery), true);
        }
    }
    

    【讨论】:

    • 我在 asp.net mvc 2 应用程序中尝试了这段代码。但是这个方法没有被调用。
    • @loviji:您如何在 MVC 中使用 ReportViewer?它是一个 WebForms 控件...无论如何,Global.asax 中的 Application_Error 应该适用于所有 ASP.Net 站点。查看如何在 ASP.NET 中正确使用和设置特殊的 Application_Error 方法——网上有很多关于如何做到这一点的帮助。
    【解决方案2】:

    会话超时

    这可能是由于您的会话超时时间太短。查看 Web.Config 的“sessionState”部分,例如:-

    <system.web><sessionState mode="InProc" timeout="60" /></system.web>
    

    这会将会话超时设置为 60 分钟。

    应用程序池回收

    我们遇到的另一个可能原因是您的应用程序池由于某种原因正在被回收。

    万一是因为我们达到了“最大虚拟内存”设置,我只是提高了这个设置,此后一切都很好。

    查看来自 W3SVC 的 1010、1011、1074、1077、1078、1079、1080 和 1117 事件的系统事件日志,看看您的应用程序池是否正在被回收,如果是,它应该说明原因。

    【讨论】:

      【解决方案3】:

      这是我的解决方法。

      在网络场上运行 IIS,每个场都有一个网络园 count=3,

      我只是为 sql 报告创建了一个单独的应用程序池,并为这个报告池设置了 web garden count=1。

      然后,在 IIS 中创建一个虚拟目录和一个用于报告的单独项目 - 使用该报告池

      问题解决了。

      【讨论】:

        【解决方案4】:

        我在自己的 PC 上开发时遇到了这个问题,在网上的任何地方都找不到答案。原来我的一个队友把这个添加到了 web.config 中:

        <httpCookies httpOnlyCookies="false" requireSSL="true" />
        

        所以开发者桌面上的web.config 不应该有这个标签,而 DEV/QAS 和 Prod web.config 文件应该有它。

        我也了解开发人员可以使用 IIS Express,然后他们可以在本地使用 SSL。

        【讨论】:

          【解决方案5】:

          问题是什么?会话已过期,他们无法继续。

          检查报告处理速度。建立某种基准或简单地要求他们衡量报告处理。

          很可能它对您有用,但对他们无效(较慢的网络、要处理的更多数据、较慢的数据库服务器等等)。

          编辑: Here is 另一个解释,也许是问题的解决方案,但我不建议在生产环境中将工作进程号设置为 1。

          【讨论】:

            【解决方案6】:

            web gardern count=1 为我工作

            【讨论】:

              【解决方案7】:

              检查应用程序池的最大工作进程数, 因为 Worker Processes 的 Asp NET Session 是不同的。

              如果您有超过 1 个工作进程进程内会话状态,那么每个进程都会有自己的会话。

              会话状态类型

              1. 进程内:会话状态存储在工作进程中,其中 ASP.NET 应用程序运行。
              2. 状态服务器:存储会话状态 在运行 ASP.NET 应用程序的工作进程之外。
              3. SQL Server:会话状态存储在 SQL Server 数据库中。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-04-14
                • 2010-10-23
                • 2012-02-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-05-09
                相关资源
                最近更新 更多