2009-11-23 38 views
6

我們發現ASP.NET 3.5和ReportViewer與Google Chrome之間存在一個有趣的問題。我們的一組頁面正常工作,直到ReportViewer控件顯示報表。谷歌Chrome然後吃了50%的CPU看起來什麼也不做。ASP.NET ReportViewer Google Chrome CPU使用率

我已經提取ReportViewer控件到一個空白的Web窗體項目來確認它的控制,而不是我的代碼的無賴。

我在本地模式(RDLC文件)中使用ReportViewer,所以我認爲它的2005版?

任何人都看過這個,並有解決方案嗎?

菲爾

編輯:谷歌瀏覽器3.0.195.33對Vista商業版64位

編輯2:添加賞金幫助解決這個

+0

仍然沒有可接受的答案或解決方案,這顯然是在ReportViewer控件中的localmode造成這種情況。仍然無法找到責任部分:( – Phil 2009-12-06 14:55:11

+0

也發生在Safari的Windows - 聞起來像一個WebKit的bug對我來說! – 2010-02-02 20:43:32

+0

我使用它在鉻19和它的正常工作,但當我打開開發人員工具(Inspect元素)來檢查它的css類,然後它變得內存飢餓,網頁異常開始消耗數百MB直到1.5GB並掛起,我們必須使用任務管理器手動終止頁面 – MaxRecursion 2012-06-21 11:41:58

回答

8

該解決方案實際上是ReportViewer的一些JavaScript導致Chrome中的無限循環,我發佈瞭如何通過製作ReportViewer控件的自定義版本並修復損壞的JavaScript來解決此問題的源代碼(我已失去了解決方案的鏈接,但我沒有寫這個,只是用它:))

我可以確認,現在我們已經升級到最新的ReportViewer在Visual Studio 2010中,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); 
     } 
    } 
} 
+0

是的,它像一個魅力。 – 2011-07-14 02:47:35

+0

解決方案鏈接:http://productforums.google.com/d/msg/chrome/XyOh1fDq_GA/ggPKU19_0ycJ – MaxRecursion 2012-06-21 11:53:59

+1

我不得不適應解決方案:val = val.Replace(@「!= ' javascript:\ ' \ ' ' 「@ 」= '的javascript:\ ' \ ' ' &&假「);'可能是由於不同的版本SSRS – Johann 2013-11-04 17:41:03

0

我有這個問題,它驅使我是絕對瘋了!

首先保存生成的文件 - 這是如果你可以。有時它會凍結。保存並檢查正在生成的報告的大小。我的問題分散在超過16MB的文件中,導致瀏覽器和網絡速度變慢。

請幫忙看看HTML表單,通過查看源代碼,在Web表單內生成。檢查樣式是否已經在生成的文檔內部直接寫入,而不是從文件引用。

嘗試從報告中刪除樣式,看看是否有幫助。

1

谷歌Chrome論壇上有一篇關於此的帖子。我不知道是否可以在服務器上運行報告,而不是在本地運行,這似乎解決了問題。這是線程: ReportViewer rendering maxes out thread CPU usage

+0

不是一個選項,因爲數據來自許多不同的地方,需要進行處理,然後綁定爲對象數據源。 – Phil 2009-12-05 00:10:51

0

儘管Chrome瀏覽器是一個不錯的瀏覽器,並且發展速度相當快,但恐怕現在除了使用其他瀏覽器之外,現在還沒有解決方案。我想Google最終會在這個問題上努力,但現在它不是固定的。

我認爲他們會嘗試解決其他問題。我確實看到其他頁面以奇怪的方式用chrome渲染,而不是用IE。

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事件有問題的代碼 - 渲染代碼加入「& &假」的條件禁用if語句。

下面的javascript通過在加載頁面後清空onload來完成相同的事情,停止循環。我不確定什麼onload事件實際上做,如果這樣將其取出:

// 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 = ""; 
} 

注(在[MSSQL報告服務文件夾] \ ReportManager \ JS \ ReportingServices.js底部添加此)殺死其他一些功能。應該有一些方法來改變onload,就像Phil的解決方案一樣,或者是一個依賴於瀏覽器的修復程序,但是這個技巧並沒有在IE中遇到問題。

0

這確實對我有效,但這並不是我會推薦它。 我注意到我的WebKitInspector會導致瀏覽器凍結。

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

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

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

如果我們從變更文件類型:

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

到:

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

它適用於Chrome,但停止工作的IE瀏覽器。

+0

Robert 2013-03-01 00:45:52

+0

Reportviewer未在Chrome和Safari中顯示,但它在IE和Firefox中正常工作。只需刪除Doctype中的額外值並保留!DOCTYPE>,它對我有用 – Robert 2013-03-01 00:50:14