8

This is the 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 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 report(which is a view in asp.net mvc) it opens in a new tab to view the report (which is aspx page with codefile) and 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. I tried doing everything but no solution found yet. Need help

garryp
  • 5,508
  • 1
  • 29
  • 41
rohit singh
  • 550
  • 1
  • 11
  • 32
  • 1
    http://stackoverflow.com/questions/4318965/asp-net-session-request-queuing http://odetocode.com/Blogs/scott/archive/2006/05/21/session-state-uses-a-reader-writer-lock.aspx – ta.speot.is May 05 '15 at 05:35
  • Is this mislabeled as mvc issue? Runat:server and code behind aren't part of mvc framework – Dave Alperovich May 05 '15 at 22:49
  • the aspx page is added in my mvc project as i mentioned above. The link to view the report is in mvc view page and the report itself opens with aspx page as to use the report viewer control. In short a single aspx/aspx.cs page is integrated in my mvc application to view the reports – rohit singh May 06 '15 at 03:54

3 Answers3

5

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

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.

You can read more about the problem 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.

Emphasis mine.

To mitigate this, you can enable or disable session state for individual pages, or declare your usage of session state as "read only".

Pay attention not to accidentally choose the wrong type of session state, however (enabled, disabled, read only). It needs to be set correctly for your application to work correctly.

ta.speot.is
  • 26,914
  • 8
  • 68
  • 96
  • 1
    disabling or readonly is not working with report viewer. It's not getting the data and error – rohit singh May 05 '15 at 06:05
  • You can't disable it because you use it: `if (Session["UserInfo"] == null)` Like I said, don't pick the wrong type. – ta.speot.is May 05 '15 at 07:08
  • How to progress further then? The report takes time to load and mean while the other links are blocked loading until the report finishes. My application is develop in asp.net MVC but the report portion is created with aspx/aspx.cs page. I trouble shooted and found some points. Do you think this javascipt automatically generated by report viewer may have caused the issue? There is lot of javascript like this : – rohit singh May 05 '15 at 07:21
  • by profiling you mean changing the application? I'm kinda stuck in it, don't know how to proceed. – rohit singh May 07 '15 at 04:32
  • These applications will show you where your website is spending time, this will confirm whether you're having problems with the session state or not http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/ https://www.jetbrains.com/profiler/ Brief tutorial: http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/walkthrough – ta.speot.is May 07 '15 at 05:43
  • Though i solved it with the help of another thread, but i'll mark it as the answer as it gave me the information on why the problem is occuring. – rohit singh May 13 '15 at 06:02
  • You solved it on another thread. What was that thread or what was the solution? – Mark Dornian Feb 14 '16 at 00:11
4

Since the ReportViewer user's session state continously, it uses a lock that blocks page loading.The method which i followed to solve my problem is :

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

This thread helped me in solving my issue : The attempt to connect to the report server failed - Setting URL and Path in ASP.NET?

Community
  • 1
  • 1
rohit singh
  • 550
  • 1
  • 11
  • 32
1

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 with this.

ThePravinDeshmukh
  • 1,823
  • 12
  • 21