ASP.NET ReportViewer Google Chrome CPU使用情况

时间:2009-11-23 17:21:31

标签: asp.net reporting-services google-chrome reportviewer

我们在ASP.NET 3.5和ReportViewer与Google Chrome之间发现了一个有趣的问题。我们的页面工作正常,直到ReportViewer控件显示报表。

然后,谷歌Chrome会占用50%的CPU,看起来什么也不做。

我已经将ReportViewer控件解压缩到一个空白的Web窗体项目,以确认它的控件,而不是我的代码中的流氓位。

我在本地模式下使用ReportViewer(RDLC文件),所以我推测它的2005版本?

之前有人见过这个并有解决方案吗?

菲尔

编辑:Vista Business x64上的Google Chrome 3.0.195.33

编辑2:添加赏金以帮助修复此

7 个答案:

答案 0 :(得分:8)

解决方案实际上是一些ReportViewer JavaScript在Chrome中导致无限循环,我发布了关于如何通过制作ReportViewer控件的自定义版本并修复损坏的JavaScript来解决此问题的源代码(我已丢失解决方案的链接,但我没有写这个,只是用它:))

我可以确认,现在我们已经升级到Visual Studio 2010中的最新ReportViewer,Chrome CPU问题不再存在,并且不需要这种解决方法。

public class MyReportViewer : Microsoft.Reporting.WebForms.ReportViewer
{
    protected override void Render(HtmlTextWriter writer)
    {
        using (StringWriter sw = new StringWriter())
        {
            HtmlTextWriter tmpWriter = new HtmlTextWriter(sw);
            base.Render(tmpWriter);
            string val = sw.ToString();
            val = val.Replace(@"!= 'javascript:\'\''", @"!= 'javascript:\'\'' && false");
            writer.Write(val);
        }
    }
}

答案 1 :(得分:1)

Google Chrome论坛上有一个关于此问题的帖子。我不知道你是否有可能在服务器而不是本地运行报告,这似乎解决了这个问题。这是线程: ReportViewer rendering maxes out thread CPU usage

答案 2 :(得分:1)

如果您使用的是像我这样的报表管理器(2005版),则无法对ReportViewer控件进行任何操作。 (有吗?)但有另一种选择:

Phil的解决方案有效地禁用了iframe的onload事件运行的代码。在SSRS 2005中,这是一个id为'ctl140TouchSession0'的iframe:

<iframe name="ctl140TouchSession0" id="ctl140TouchSession0" onload="if (frames['ctl140TouchSession0'].location != 'javascript:\'\'') frames['ctl140TouchSession0'].location.replace('javascript:\'\'');" src="javascript:''" style="position:absolute;width:0;height:0;border-width:0;visibility:hidden;">

您可以在onload事件中看到有问题的代码 - 渲染代码通过在条件中添加“&amp;&amp; false”来禁用if语句。

以下javascript通过在页面加载后清空onload来完成同样的事情,停止循环。

(在[MSSQL Reporting Services文件夹] \ ReportManager \ js \ ReportingServices.js的底部添加此内容)

// CUSTOMIZATIONS
addLoadEvent(customize);

//some browser-independent onload-adder I pulled from somewhere
function addLoadEvent(fn)
{
    if (window.addEventListener)
        window.addEventListener('load', fn, false);
    else if (window.attachEvent)
        window.attachEvent('onload', fn);
}

function customize()
{
    //the actual fix. 
    //check first, we may be in a page without a reportviewer
    if(document.getElementById('ctl140TouchSession0'))
        document.getElementById('ctl140TouchSession0').onload = "";
}

注意:我不确定onload事件实际上是做什么的,如果像这样删除它会杀死其他一些功能。应该有一些方法可以像Phil的解决方案或依赖于浏览器的解决方案一样改变onload,但是这样做了,我还没有在IE中遇到过问题。

答案 3 :(得分:1)

如果我们更改了文档类型:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">

为:

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

它适用于chrome但停止在IE上工作。

答案 4 :(得分:0)

我有这个问题,它让我绝对疯狂!

首先保存生成的文件 - 如果可以的话。有时会冻结。保存并检查正在生成的报告的大小。我的问题是在生成超过16MB的文件中重新出现,并减慢了浏览器和网络的速度。

通过查看源代码来帮助您查看html,这是在Web表单中生成的。检查样式是否已在生成的文档中明确内联写入,而不是从文件中引用。

尝试从报告中删除样式,看看是否有帮助。

答案 5 :(得分:0)

虽然Chrome是一款不错的浏览器,而且发展速度相当快,但我担心除了使用其他浏览器之外,目前还没有解决方案。我认为谷歌最终会在这个问题上努力,但目前还没有解决。

我认为他们会尝试修复其他问题。我确实看到其他页面使用chrome而不是使用IE进行渲染。

答案 6 :(得分:0)

这对我有用,但并不是我会推荐它。 我注意到我的WebKitInspector会导致浏览器冻结。

var iframes = document.getElementsByTagName("IFRAME");

for (var i = 0, ln = iframes.length; i < ln; i++) {

    iframes[0].parentNode.removeChild(iframes[0]);
}