将大缓冲区加载到html元素中的最有效方法

时间:2014-04-15 15:05:49

标签: c# jquery asp.net-mvc reporting-services

我制作了一个自定义报表查看器控件,它使用了ssrs渲染请求的输出。我很难匹配ssrs ReportViewer控件的速度。报告是2.5百万。

我正在通过电线观察请求和响应,并且可以看到从ssrs获取内容缓冲区大约需要2.8秒。但是,在当前视图中显示html元素内容需要10-15秒。

问题是当我直接登录ssrs管理器并呈现报告所需的时间与处理报告一样长时,在ssrs报告查看器控件中渲染只需3秒钟。

最初的设计是将html作为有效负载放在ajax响应上。然后我认为json序列化/反序列化可能是瓶颈所以我添加了将输出保存到服务器上的临时文件夹的能力,如html和调用load(html)......没有改进。

我使用以下代码从Ajax.BeginForm成功函数加载我页面中的内容:

function setReportContent(content, isUrl) {
    if(isUrl)
        $('#reportContent').load(content);
    else
        $("#reportContent").html(content);
    showReportWaitIndicator(false);
    $("#reportContent").show();
 }

我无法弄清楚为什么在ssrs报表查看器控件和我加载的方式之间的渲染时间存在如此巨大的差异。

是否有更有效的技术来加载.load(url);以外的大型内容?

编辑:我已下载html文件并直接在浏览器中打开,并立即呈现标记。为什么将内容附加到dom最多需要20秒?

由于

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,但是它使用了一个IFrame,我对此感到满意,但它与ssrs报告查看器的速度相匹配。简而言之,加载IFrame不包含将内容放在dom中的一些开销。对setip做了一个小调整,它有效。

function setReportContent(content, isUrl, renderInIFrame) {        
    if (isUrl) {
        if (renderInIFrame)
            $("#reportContent").html("<iframe id='reportFrame' scrolling='yes' onload='resizeReportFrame();' src='" + content + "'\></iframe>");
        else
            $("#reportContent").load(content);
    }
    else {
        if (renderInIFrame) {
           $("#reportContent").html("<iframe id='reportFrame' scrolling='yes' onload='resizeReportFrame();'\></iframe>");
           $('#reportFrame').contents().find('html').html(content);
        }
        else
            $("#reportContent").html(content);            
   }
   showReportWaitIndicator(false);
   $("#reportContent").show();
}