ReportViewer 正在阻止其他功能,直到报表查看器加载完成

ReportViewer is blocking other functionalites until the loading of report viewer is completed

这是 ReportViewer 控件:

  <form id="reportForm" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" AsyncPostBackTimeout="360000">
    </asp:ScriptManager>
    <div>
      <rsweb:ReportViewer ID="mainReportViewer" runat="server" Width="100%" 
            Height="100%" SizeToReportContent="True"  >
      </rsweb:ReportViewer>
    </div>
  </form>

这是页面背后的代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["UserInfo"] == null)
    {
        Response.Redirect("~/account/login", true);
    }
    string ReportPath = "";
    try
    {
        if (mainReportViewer.Page.IsPostBack) return;

        mainReportViewer.ProcessingMode = ProcessingMode.Remote;

        mainReportViewer.ServerReport.ReportServerUrl = new Uri(
            @"" + ConfigurationManager.AppSettings["ReportServer"].ToString()
        );
        ReportPath = Convert.ToString(ConfigurationManager.AppSettings["ReportPath"]);
        if (!string.IsNullOrEmpty(ReportPath))
        {
            if (ReportPath.Substring(0, 1) == "/")
            {
                ReportPath = ReportPath.Substring(1, ReportPath.Length - 1);
            }
            if (ReportPath.Substring(ReportPath.Length - 1, 1) != "/")
            {
                ReportPath = ReportPath + '/';
            }
        }
        else
        {
            ReportPath = "";
        }
        ReportPath = ReportPath + Request["Report"].ToString().Split(".".ToCharArray())[0].ToString();
        mainReportViewer.ServerReport.ReportPath = @"/" + ReportPath;

        ReportParameterCollection parmCol = new ReportParameterCollection();
        string sFrom = "";
        string sTo = "";
        string dateRange = Request["dateRange"].ToString();
        string[] obj = dateRange.Split("-".ToCharArray());
        if (obj.Length > 1)
        {
            sFrom = obj[0].ToString();
            sTo = obj[1].ToString();
        }
        else
            sFrom = obj[0].ToString();
        else if (Request["Report"].ToString().ToUpper() == "SOURCEWISEREPORT_AR.RDL")
        {
            string[] frommonthyear = sFrom.Split(',');
            string[] tomonthyear = sTo.Split(',');

            parmCol.Add(new ReportParameter("FromYear", frommonthyear[1]));
            parmCol.Add(new ReportParameter("FromMonth", frommonthyear[0]));
            parmCol.Add(new ReportParameter("ToYear", tomonthyear[1]));
            parmCol.Add(new ReportParameter("ToMonth", tomonthyear[0]));
            parmCol.Add(new ReportParameter("lang", Convert.ToString(Session["Culture"])));
        }
        mainReportViewer.PromptAreaCollapsed = true;
        mainReportViewer.AsyncRendering = true;
        mainReportViewer.ServerReport.Timeout = System.Threading.Timeout.Infinite;
        mainReportViewer.ServerReport.SetParameters(parmCol);
        mainReportViewer.ShowParameterPrompts = true;
        mainReportViewer.LocalReport.EnableHyperlinks = true;
        mainReportViewer.ServerReport.Refresh();
    }
    catch (Exception ex)
    {
        CommonFunctions.createLog("Reports : " + ex.Message);
    }
}

当我尝试查看报告(asp.net mvc 中的视图)时,它会在新选项卡中打开以查看报告(这是带有代码文件的 aspx 页面),同时如果我尝试打开any link from the previous tab 在新选项卡中的报告完全加载之前,页面不会加载。我尝试了一切,但尚未找到解决方案。需要帮助

mean while if i try to open any link from the previous tab the page doesn't get loaded until the report in the new tab is completely loaded

您需要分析您的应用程序。您的请求很可能已排入队列,试图为用户的会话状态获取写锁。

您可以阅读有关该问题的更多信息here

To prevent two pages from modifying in-process Session variables at the same time, the ASP.NET runtime uses a lock. When a request arrives for a page that reads and writes Session variables, the runtime acquires a writer lock. The writer lock will block other pages in the same Session who might write to the same session variables.

强调我的。

为了缓解这种情况,you can enable or disable session state for individual pages, or declare your usage of session state as "read only"

注意不要意外选择错误的会话状态类型,但是(启用、禁用、只读)。需要正确设置它才能使您的应用程序正常工作。

你能试试吗?

System.Threading.Thread thLoadReport = new System.Threading.Thread(new System.Threading.ThreadStart(LoadReport));
thLoadReport.Start();

private void LoadReport()
{
    // Invoke necessary controls here for eg.
    mainReportViewer.Invoke((MethodInvoker)delegate {
        // your report loading here
    });
}

如果您需要更多帮助,请告诉我。

由于 ReportViewer 用户的会话状态不断,它使用一个锁来阻止页面 loading.The 我遵循的解决问题的方法是:

  • 创建Class并实施IReportServerConnection2interface
  • add key="ReportViewerServerConnection" value="MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 00000000000000000 "/>web.config 文件 <appsettings>
  • ReportViewer.aspx页面设置EnableSessionState = "Readonly"

这个帖子帮助我解决了我的问题: The attempt to connect to the report server failed - Setting URL and Path in ASP.NET?