我们正在运行IIS& SSRS在同一个生产服务器上,有两种类型的报告 - 一种是通过Report Viewer运行,连接到SSRS(远程模式),另一种是调用SSRS Web服务来生成PDF。
对于这两种报告类型,加载页面时变得非常慢,耗时超过20秒。在服务器负载繁重期间最明显的是,在IIS中回收应用程序池后缓慢会消失,但一段时间后会恢复(应用程序池设置为每天凌晨3点回收)。
我检查了SSRS的执行日志 - 对于所有报告,数据检索+处理+渲染的时间不会超过2秒,SSRS的http日志表明当页面变为IIS时没有来自IIS的请求没有反应 - 一旦请求确实达到它加载非常快。 通过报表管理器运行的报表也非常快。
似乎SSRS不是罪魁祸首,似乎IIS中的某些东西正在造成它。
是否还有其他人遇到过类似的问题,或者能指出正确的诊断方向?
非常感谢。
的ReportViewer:
public abstract class ReportPageBase : System.Web.UI.Page
{
protected void GenerateReport(ReportViewer reportViewer)
{
var reportParameters = new List<ReportParameter>();
reportViewer.Visible = true;
reportViewer.ServerReport.ReportServerUrl = new Uri(Util.ReportServerUrl);
reportViewer.ServerReport.ReportServerCredentials = new ReportServerCredentials();
ParametersOverride(ref reportParameters);
reportViewer.ServerReport.SetParameters(reportParameters);
}
protected abstract void ParametersOverride(ref List<ReportParameter> reportParameters);
}
网络服务:
public static class ReportExporter
{
public static Stream GetExportStream(string reportName, string format, ReportExecutionService.ParameterValue[] paramVals)
{
var rs = new ReportingService2005SoapClient();
var rsExec = new ReportExecutionServiceSoapClient();
var username = ConfigurationManager.AppSettings["ReportViewerUser"];
var password = ConfigurationManager.AppSettings["ReportViewerPassword"];
var domain = ConfigurationManager.AppSettings["ReportViewerDomain"];
var folderPath = ConfigurationManager.AppSettings["ReportViewerFoler"];
System.Net.NetworkCredential networkCredential = new System.Net.NetworkCredential(username, password, domain);
rs.ClientCredentials.Windows.ClientCredential = networkCredential;
rsExec.ClientCredentials.Windows.ClientCredential = networkCredential;
rs.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
rsExec.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
var _reportName = (folderPath ?? @"/") + reportName.Trim();
string historyID = null;
// gets the parameters
rs.GetReportParameters(_reportName, historyID, forRendering, values, credentials, out parameters);
// load the report
ExecutionInfo executionInfo = null;
ReportExecutionService.ServerInfoHeader serverInfoHeader = null;
ExecutionHeader header = new ExecutionHeader();
rsExec.LoadReport(null, _reportName, historyID, out serverInfoHeader, out executionInfo);
header.ExecutionID = executionInfo.ExecutionID;
rsExec.SetExecutionParameters(header, null, paramVals, "en-us", out executionInfo);
byte[] result = null;
string[] streamIds = null;
string encoding = String.Empty;
string mimeType = String.Empty;
string extension = String.Empty;
ReportExecutionService.Warning[] warnings = null;
rsExec.Render(header,
null,
format,
null,
out result,
out extension,
out mimeType,
out encoding,
out warnings,
out streamIds);
var memstream = new MemoryStream(result);
return memstream;
}
}
答案 0 :(得分:1)
就我而言。 IIS Express 非常快。但是在 IIS 8.5 下慢得不能接受! 我的解决方案: