在完成报表查看器的加载之前,ReportViewer会阻止其他功能

roh*_*ngh 7 .net asp.net asp.net-mvc reportviewer

这是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>
Run Code Online (Sandbox Code Playgroud)

这是页面背后的代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试查看报告(这是asp.net mvc中的视图)时,它会在新选项卡中打开以查看报告(这是带有代码文件的aspx页面),并且如果我尝试打开上一个选项卡中的任何链接,则表示在完全加载新选项卡中的报表之前,页面不会加载.我尝试了一切,但尚未找到解决方案.需要帮忙

ta.*_*.is 5

表示如果我尝试打开上一个选项卡中的任何链接,则在新选项卡中的报表完全加载之前,页面不会加载

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

您可以在此处详细了解该问题:

为防止两个页面同时修改进程内的Session变量,ASP.NET运行时使用锁.当请求到达读取和写入会话变量的页面时,运行时获取写入器锁定.写入程序锁将阻止同一会话中可能写入相同会话变量的其他页面.

强调我的.

要缓解这种情况,您可以为各个页面启用或禁用会话状态,或将会话状态的使用声明为"只读".

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