【问题标题】:ASP.NET ReportViewer Google Chrome CPU usageASP.NET ReportViewer Google Chrome CPU 使用率
【发布时间】:2009-11-23 17:21:31
【问题描述】:

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

然后谷歌浏览器消耗了 50% 的 CPU,看起来什么都不做。

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

我在本地模式下使用 ReportViewer(RDLC 文件),所以我认为它是 2005 版本?

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

菲尔

编辑:Vista Business x64 上的 Google Chrome 3.0.195.33

编辑 2:添加赏金以帮助解决此问题

【问题讨论】:

  • 仍然没有可接受的答案或解决方案,这显然是在本地模式下的 ReportViewer 控件中导致此问题的原因。仍然无法找到负责的部分:(
  • 在 Safari for Windows 中也发生了 - 我闻起来像 WebKit 错误!
  • 我在 chrome 19 中使用它,它工作正常,但是当我打开开发者工具(检查元素)来检查它的 css 类时,它变得内存不足,网页异常开始消耗数百 MB 直到 1.5 GB 并挂起。我们必须使用任务管理器手动杀死页面。

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


【解决方案1】:

解决方案实际上是某些 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);
        }
    }
}

【讨论】:

  • 我不得不稍微调整一下解决方案:val = val.Replace(@"!= 'javascript:\'\''", @"!= 'javascript:\'\'' && false"); 可能是由于不同版本的 SSRS
【解决方案2】:

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

【讨论】:

  • 不是一个选项,因为数据来自许多不同的地方,需要进行处理,然后绑定为对象数据源。
【解决方案3】:

如果您像我一样使用报告管理器(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 事件中看到违规代码 - 渲染代码通过在条件中添加“&& 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 中遇到问题。

【讨论】:

    【解决方案4】:

    如果我们将文档类型更改为:

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

    到:

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

    它在 chrome 上工作,但在 IE 上停止工作。

    【讨论】:

    • Reportviewer 未在 Chrome 和 Safari 中显示,但在 IE 和 Firefox 中运行良好。刚刚删除了 Doctype 中的额外值并只保留了 !DOCTYPE> 它对我有用
    【解决方案5】:

    我遇到了这个问题,它把我逼疯了!

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

    帮自己一个忙,通过查看源代码查看在 Web 表单中生成的 html。检查样式是否已在生成的文档中显式地内联写入,而不是从文件中引用。

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

    【讨论】:

      【解决方案6】:

      虽然 Chrome 是一款不错的浏览器并且发展得相当快,但恐怕目前除了使用其他浏览器之外没有其他解决方案。我认为谷歌最终会解决这个问题,但目前还没有解决。

      我认为他们会尝试解决其他问题。我确实看到其他页面使用 chrome 而不是 IE 以一种奇怪的方式呈现。

      【讨论】:

        【解决方案7】:

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

        var iframes = document.getElementsByTagName("IFRAME");
        
        for (var i = 0, ln = iframes.length; i < ln; i++) {
        
            iframes[0].parentNode.removeChild(iframes[0]);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-13
          • 1970-01-01
          相关资源
          最近更新 更多