ASP.NET ReportViewer Использование ЦП Google Chrome

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

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

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

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

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

Фил

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

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


person Phil    schedule 23.11.2009    source источник
comment
По-прежнему нет приемлемых ответов или решений, что явно является причиной этого в элементе управления ReportViewer в локальном режиме. Ответственную часть найти не удалось :(   -  person Phil    schedule 06.12.2009
comment
То же самое происходит в Safari для Windows - для меня это пахнет ошибкой WebKit!   -  person Stefan Mohr    schedule 02.02.2010
comment
Я использую его в chrome 19, и он работает нормально, но когда я открываю инструменты разработчика (Inspect Element) для проверки его классов css, он становится голодным по памяти, а веб-страница ненормально начинает потреблять сотни МБ до 1,5 ГБ и зависает. Приходится вручную убить страницу с помощью диспетчера задач.   -  person MaxRecursion    schedule 21.06.2012


Ответы (7)


На самом деле решение заключается в том, что JavaScript ReportViewer вызывает бесконечный цикл в 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);
        }
    }
}
person Phil    schedule 25.05.2010
comment
ссылка на решение: productforums.google.com/d/msg/chrome/XyO_h1fDq_GA/ggPKU19 - person MaxRecursion; 21.06.2012
comment
Мне пришлось немного изменить решение: val = val.Replace(@"!= 'javascript:\'\''", @"!= 'javascript:\'\'' && false"); Возможно, из-за другой версии SSRS - person Johann; 04.11.2013


Если вы используете диспетчер отчетов, как я (версия 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] \ 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.

person H B    schedule 27.09.2011

Если мы изменим тип документа с:

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

to:

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

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

person Robert    schedule 01.03.2013
comment
‹! DOCTYPE HTML PUBLIC - // W3C // DTD HTML 4.01 Transitional // EN› - person Robert; 01.03.2013
comment
Reportviewer не отображался в Chrome и Safari, но работал нормально в IE и Firefox. Просто удалил лишние значения в Doctype и оставил только! DOCTYPE ›, и это сработало для меня - person Robert; 01.03.2013

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

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

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

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

person Jonathan    schedule 30.11.2009

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

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

person David Brunelle    schedule 05.12.2009

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

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

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

    iframes[0].parentNode.removeChild(iframes[0]);
}
person EricG    schedule 08.11.2012