Является ли Microsoft ASP.NET Ajax причиной утечки DOM-объектов? - PullRequest
2 голосов
/ 04 сентября 2008

Мы использовали «Drip», чтобы попытаться определить, почему страницы с UpdatePanels в них имеют тенденцию использовать много клиентской памяти. На странице с обычной обратной передачей мы видим 0 утечек, обнаруженных Drip. Тем не менее, когда мы добавляем панель обновления к миксу, каждый отдельный объект DOM, который находится внутри панели обновления, кажется, протекает (согласно Drip).

Я не уверен, что Drip достаточно надежен, чтобы сообщать о подобных вещах - сообщаемые утечки, похоже, указывают на то, что Drip немного изменяет страницу.

У кого-нибудь есть опыт с этим? Должен ли я паниковать и прекратить использование Microsoft Ajax? Я не сомневаюсь в Microsoft, но мне кажется подозрительным, что это может быть это плохо.

Кроме того, если вам известен инструмент, который лучше, чем Drip, он также будет полезен.

Ответы [ 3 ]

2 голосов
/ 04 сентября 2008

Согласно ASP.NET AJAX в действии , с. 257

Непосредственно перед тем, как старая разметка заменяется обновленным HTML, все элементы DOM на панели проверяются на поведение Microsoft Ajax или связанные с ними элементы управления. Чтобы избежать утечек памяти, компоненты, связанные с элементами DOM, удаляются, а затем уничтожаются при замене HTMl.

Насколько я знаю, любые компоненты ajax asp.net на панели обновлений расположены для предотвращения утечек памяти, но все остальное там будет заменено полученным html.

Так что, если в целевом контейнере для ответа нет компонентов ajax asp.net для ответа, это будет в основном то же самое, что и внутренняя замена html любым другим запросом js framework / ajax, поэтому я бы сказал, только то, как браузер обрабатывает это, а не asp.net ajax, вызывающий это.

Кроме того, хотя это может быть «утечка», это может быть связано с тем, что браузер еще не восстановил элементы dom и не выпустил их. Кроме того, капля может вызывать утечку, поскольку она прикрепляется к этим элементам DOM.

0 голосов
/ 04 сентября 2008

вы можете прикрепить к событию pageLoading класса PageRequestManager , пройти через свойство обновления панелей и удалить элементы DOM в каждом.

0 голосов
/ 04 сентября 2008

Это очень вероятно. Это было почти то, что мы предполагали (проблема с браузером, не обязательно Ajax).

Наша проблема сейчас в том, что к этому приложению многие люди обращаются через среду Citrix, когда каждая страница непрерывно создает объекты DOM и не выпускает их, среда Citrix начинает зависать после некоторого использования. Я видел подобные жалобы в Интернете (особенно если вы достаточно тупы, чтобы получить доступ к веб-сайту Ajax через Citrix), но я не чувствую себя намного лучше, если это именно так.

Теперь мне интересно, придумал ли кто-нибудь умный обходной путь. У нас также есть клиентское приложение, в котором мы используем .NET BrowserControl для доступа к этим сайтам, а не просто IE7, поэтому, если кто-то знает секретный вызов API ( FreeStaleDomObjectsFTW () ), мы можем использовать его с этой стороны стека, это также было бы полезно.

...