ASP.NET использование процессора Google Chrome ReportViewer

мы нашли интересный вопрос между ASP.NET 3.5 и ReportViewer с Google Chrome. Наш набор страниц работает нормально, пока элемент управления ReportViewer не отобразит отчет.

Google Chrome затем съедает 50% процессора, ничего не делая.

я извлек элемент управления ReportViewer в пустой проект веб-форм, чтобы подтвердить его этот элемент управления, а не изгоев бит моего кода.

Я использую ReportViewer в локальном режиме (файл RDLC), поэтому я предполагаю, что его Версия 2005 года?

кто-нибудь видел это раньше и есть решение?

Фил

изменить: Google Chrome 3.0.195.33 на Vista Business x64

Edit 2: Добавлена щедрость за помощь в исправлении этого

7 ответов


решение на самом деле некоторые из ReportViewer JavaScript вызывает бесконечный цикл в Chrome, я публикую исходный код о том, как решить эту проблему, сделав пользовательскую версию элемента управления ReportViewer и исправив сломанный JavaScript (я потерял ссылку на решение, но я не писал это, просто использовал его :))

Я могу подтвердить, что теперь мы обновили до новейшего ReportViewer в Visual Studio 2010, проблема процессора Chrome больше не существует, и это работает не требуется.

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);
        }
    }
}

на форумах Google Chrome есть тема, говорящая об этом. Я не знаю, возможно ли запустить отчет на сервере, а не локально, что, похоже, устраняет проблему. Вот нить: ReportViewer рендеринга Максов из потока CPU использование


Если вы используете диспетчер отчетов, как я (версия 2005), вы мало что можете сделать с элементом управления ReportViewer. (есть ли?) Существует альтернатива, хотя:

решение Фила эффективно отключает код, запускаемый событием onload iframe. В SSRS 2005 это iframe с идентификатором "ctl140TouchSession0":

<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, добавляя "& & false" в состояние.

следующий 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 на самом деле, и если извлекать его, как это убивает некоторые другие функции. Должен быть какой-то способ изменить onload так же, как решение Фила, или браузер зависит от исправления, но это делает трюк, и я еще не сталкивался с проблемами в IE.


если мы изменим тип doc с:

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

в:

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

он работает на chrome, но перестает работать с IE.


У меня была эта проблема,и это сводило меня с ума!

прежде всего сохраните сгенерированный файл-это если сможете. Иногда он замерзает. Сохраните и проверьте размер создаваемого отчета. Моя проблема resuletd в файлах, превышающих 16MB, генерируется и замедляет браузер и сеть.

сделайте себе одолжение посмотрите на html, просмотрев источник, который генерируется внутри веб-формы. Проверьте, был ли написан стиль явно встроенный в созданный документ вместо ссылки из файла.

Попробуйте удалить стиль из отчета и посмотреть, если это помогает.


в то время как Chrome-хороший браузер и развивается довольно быстро, я боюсь, что сейчас нет другого решения, кроме использования другого браузера. Я бы подумал, что Google будет работать над этой проблемой в конечном итоге, но пока это не исправлено.

Я думаю, что они попытаются исправить другие проблемы. Я видел, что другие страницы отображаются странным образом с chrome, а не с IE.


это сработало для меня, это не то, что я рекомендовал бы его. Я заметил, что мой WebKitInspector приведет к замораживанию браузера.

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

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

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