ReportViewer blocks other functions until the download of the report viewer is complete

This is a ReportViewer control:

<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> 

This is the code behind the page:

 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); } } 

When I try to view a report (which is a view in asp.net mvc), it opens in a new tab to view the report (which is an aspx page with a code file) and means that if I try to open any link from the previous tab, the page does not load, until the report in a new tab is fully loaded. I tried to do everything, but no solution has been found yet. Need help

+7
asp.net-mvc reportviewer
source share
3 answers

means that if I try to open any link from the previous tab, the page will not be loaded until the report in the new tab is fully loaded.

You need to profile your application. Most likely, your request has been queued, trying to get a write lock for the user's session state.

Read more about the problem here :

To prevent two pages from changing session variables in a process at the same time, the ASP.NET runtime uses locking. When a request arrives on a page that reads and writes session variables, the runtime receives a write lock. Write Lock blocks other pages in the same session that can write the same session variables.

Emphasis on mine.

To reduce this, you can enable or disable session state for individual pages, or declare your use of session state as read-only .

Please note that you do not accidentally select the wrong type of session state (enabled, disabled, read-only). It must be properly configured for your application to work properly.

+5
source share

Because the ReportViewer user session state is constant, it uses a lock that blocks page loading. The method that I performed to solve my problem is as follows:

  • Create a Class and implement the IReportServerConnection2 interface
  • add key="ReportViewerServerConnection" value="MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 00000000000000000 "/> in the web.config file in the <appsettings>
  • Set EnableSessionState = "Readonly" on the ReportViewer.aspx page

This topic helped me solve my problem: Error connecting to the report server - setting URL and path in ASP.NET?

+4
source share

Can you try

 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 }); } 

Let me know if you need more help.

+1
source share

All Articles