ASP.NET会话已过期或无法找到

时间:2012-10-22 15:49:25

标签: c# asp.net azure reportviewer

我在Windows Azure上部署了一个asp.net(VS2010 - .NET 4.0)应用程序。我正在尝试使用.NET报表查看器控件。我在本地模式下运行报告。 报告工作正常并正确显示。当我尝试将其导出到Excel / PDF / Word时,我收到此错误“ASP.NET会话已过期或无法找到”。

这是我的示例代码: ASP.NET

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="RxCloudReports.Default" EnableSessionState="True" %>

<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript">
</script>
</head>
</head>
<body>
    <form id="form1" runat="server" enctype="multipart/form-data">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>

        <rsweb:ReportViewer ID="ReportViewer1" runat="server" ProcessingMode="Local" SizeToReportContent="true" AsyncRendering = "true" 
                     ShowPageNavigationControls="true"   ShowExportControls="true" ShowToolBar="true" >

        </rsweb:ReportViewer>
</form>
</body>
</html>

C#

DataSet ds = GetDataSet(_ID, _Module);
ReportViewer1.Reset();
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.ProcessingMode = ProcessingMode.Local;
ReportViewer1.LocalReport.ReportPath = "Reports/Reports1.rdlc";
ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ReportDS", ds.Tables[0]));
ReportViewer1.LocalReport.Refresh();

4 个答案:

答案 0 :(得分:3)

我已经设置了

<rsweb:ReportViewer ... KeepSessionAlive="false" />

之后它在Azure上工作(至少对我而言)。

答案 1 :(得分:2)

答案 2 :(得分:1)

就我而言;内置在iframe中的ReportViewer控件一切正常,但是最近几天我的网站已停止工作,原因是google chrome安全更新;解决方案已为我的报表服务器(即I.E.)设置了子域。我的网站位于https://app.myapp.com,我的报表服务器位于https://reports.myapp.com

注意:仅当您使用iframe播种报表控件并且网站位于不同域中时,此解决方案才适用

参考: Developers: Get Ready for New SameSite=None; Secure Cookie Settings Announcement: SameSite Cookie Handling and .NET Framework 4.7.2 Patch Availability on Azure App Service

答案 3 :(得分:0)

除了Web场,工作进程循环,会话的实际到期等,还有另一种情况可能会发生'ASP.NET会话过期'错误。

这种情况非常恶化,我没有在Stackoverflow上看到它的答案,所以如果这发生在其他人身上,这将有望缩短痛苦。

在使用嵌入式报表查看器控件的任何应用程序中都可能出现这种情况,但如果您的应用程序具有多个经常刷新的嵌入式报表查看器控件,则会更快地显示出来。

报告查看器控件会在每次刷新时不断创建新cookie(不确定原因)。 cookie名称后缀为_SKA。

由于每个浏览器都会限制他们将存储的Cookie数量(对于最新的IE版本,它是50,对于Chrome和Firefox,它是一个更大的数字,但仍然是有限的),Cookie会累积,直到达到限制此时浏览器开始丢弃最旧的cookie,这意味着ASP.NET的会话cookie最终被丢弃,导致ASP.NET会话到期错误。

因此,在这种情况下,它与会话到期或服务器端的任何内容无关。当达到浏览器cookie计数限制时,客户端浏览器开始丢弃最旧的cookie。

我作为这个问题的解决方案来解决这个问题,其中cookie限制问题导致了另一个问题。以下代码基于该问题中的解决方案: SSRS: Why do SKA-cookies build up until: HTTP 400 Bad Request - Request Too Long

将此代码添加到global.asax将解决此问题:

    void Application_BeginRequest(object sender, EventArgs e) {
        if (Request == null || Request.Cookies == null) {
            return;
        }
        if (Request.Cookies.Count < 10) {
            return;
        }
        for (int i = 0; i < Request.Cookies.Count; ++i) {
            if (StringComparer.OrdinalIgnoreCase.Equals(Request.Cookies[i].Name, System.Web.Security.FormsAuthentication.FormsCookieName)) {
                continue;
            }
            if (!Request.Cookies[i].Name.EndsWith("_SKA", System.StringComparison.OrdinalIgnoreCase)) {
                continue;
            }
            if (i > 10) {
                break;
            }

            System.Web.HttpCookie c = new System.Web.HttpCookie(Request.Cookies[i].Name);
            c.Expires = DateTime.Now.AddDays(-1);
            c.Path = "/";
            c.Secure = false;
            c.HttpOnly = true;
            Response.Cookies.Set(c);
        }
    }