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.
强调我的。
注意不要意外选择错误的会话状态类型,但是(启用、禁用、只读)。需要正确设置它才能使您的应用程序正常工作。
你能试试吗?
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
并实施IReportServerConnection2
interface
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?
这是 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.
强调我的。
注意不要意外选择错误的会话状态类型,但是(启用、禁用、只读)。需要正确设置它才能使您的应用程序正常工作。
你能试试吗?
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
并实施IReportServerConnection2
interface
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?