Лучший отвечающий
Периодически "отпадают" веб-части и кастомные представления списков, содержащие XSL

Вопрос
-
Доброго времени суток.
В последнее время на страницах сайта c веб-частями, содержащими XSL, вылетает сообщение (и происходит до тех пор пока, я что-либо не предприму: ниже указано, как я боролся с этим; через день-два это снова повторяется):
Не удается отобразить эту веб-часть. Чтобы устранить эту ошибку, откройте данную веб-страницу в редакторе HTML, совместимом с Microsoft SharePoint Foundation, таком как Microsoft SharePoint Designer. Если эта ошибка будет повторяться, обратитесь к администратору веб-сервера.
Идентификатор взаимосвязи:98bcff3d-5cc0-42b6-819c-41d36a4aa335
Это же сообщение появляется при попытке отобразить представления списков (aspx-страницы), в коде которых есть XSL.
Веб-части и представления без XSL отображаются нормально.
Идентификаторам взаимосвязи ошибок отображения таких веб-частей и представлений в логах соответствует следующее:
Error while executing web part: System.IndexOutOfRangeException: Индекс находился вне границ массива.
в Microsoft.Xslt.MethodCollection.ResolveMethodDef(Int32 tokenNum)
в Microsoft.Xslt.MethodCollection.GetMethodInfo(Int32 methodNumber)
в Microsoft.Xslt.STransform.GetCompiledTransform()
в Microsoft.SharePoint.WebPartPages.BaseXsltListWebPart.LoadXslCompiledTransform(WSSXmlUrlResolver someXmlResolver)
в Microsoft.SharePoint.WebPartPages.DataFormWebPart.GetXslCompiledTransform()
в Microsoft.SharePoint.WebPartPages.DataFormWebPart.PrepareAndPerformTransform(Boolean bDeferExecuteTransform)
При этом:
1. На сервере были установлены обновления с дальнейшей перезагрузкой.
2. Нет сомнений в правильности XSL: раньше все отображалось - и веб-части и представления списков. В SP Designer все отображается.
Мои действия, которые позволяют временно устранению неполадку (через день-два она снова проявляет себя):
Для веб-частей:
- Перезагрузка сервера не помогает.
- Помогает пересохранении настроек веб-частей с XSL (Меню веб-части -> Изменить веб-часть -> ОК).
- Иногда пересохранения настроек веб-частей недостаточно и помогает перезапуск пула приложений SharePoint - 80 и пересохранение настроек веб-частей.
Для представлений списков:
- Перезагрузка сервера не помогает.
- Помогает установка обновлений и перезагрузка сервера.
- Помогает перезапуск пула приложений SharePoint - 80.
12 февраля 2014 г. 4:07
Ответы
-
Есть такой баг, встречается он редко. В основном после Security Updates. Помогает рестарт пулов, но не надолго. На GotDotNet так же обсуждали эту проблему - иной раз помогала только переустановка фермы целиком (форум на gdn закрыт, ссылку не дам).
Я отлавливал один раз ошибку System.IO.FileNotFoundExceptions на XsltViewWebPart. Совместно с Антоном Вишняковым. Reflector'ом ушли в код - не может быть такой ошибки и все при наличии всех файлов. Хоть убей - а она появлялась с периодичностью 2-5 дней. Веб-части восстанавливались после рестарта пулов.
Так вот выяснилось - что при некорректном XSLT файле xslt-transformer может падать с такой ошибкой и выдавать её дальше (SPS 2010). Причем 4 месяца этот xslt отрабатывал нормально, без ошибок. А потом звезды на небе сошлись неправильно и веб-парты начали отваливаться. И все это на продакшене и только на одном сервере, на dev fram воспроизвести такую ошибку не получилось. Проблема решилась заменой xslt.
Я бы посоветовал сначала проверить XSLT. Причем проверить этот XSLT на разных сайтах, сайт-коллекциях, фермах. Бывает, что код не работает на конкретной сайт-коллекции.
- Предложено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 13 февраля 2014 г. 6:03
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 14 февраля 2014 г. 5:55
12 февраля 2014 г. 6:08
Все ответы
-
Есть такой баг, встречается он редко. В основном после Security Updates. Помогает рестарт пулов, но не надолго. На GotDotNet так же обсуждали эту проблему - иной раз помогала только переустановка фермы целиком (форум на gdn закрыт, ссылку не дам).
Я отлавливал один раз ошибку System.IO.FileNotFoundExceptions на XsltViewWebPart. Совместно с Антоном Вишняковым. Reflector'ом ушли в код - не может быть такой ошибки и все при наличии всех файлов. Хоть убей - а она появлялась с периодичностью 2-5 дней. Веб-части восстанавливались после рестарта пулов.
Так вот выяснилось - что при некорректном XSLT файле xslt-transformer может падать с такой ошибкой и выдавать её дальше (SPS 2010). Причем 4 месяца этот xslt отрабатывал нормально, без ошибок. А потом звезды на небе сошлись неправильно и веб-парты начали отваливаться. И все это на продакшене и только на одном сервере, на dev fram воспроизвести такую ошибку не получилось. Проблема решилась заменой xslt.
Я бы посоветовал сначала проверить XSLT. Причем проверить этот XSLT на разных сайтах, сайт-коллекциях, фермах. Бывает, что код не работает на конкретной сайт-коллекции.
- Предложено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 13 февраля 2014 г. 6:03
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 14 февраля 2014 г. 5:55
12 февраля 2014 г. 6:08 -
Увеличил время трансформации XSL на ферме с 1 до 5 секунд с помощью PowerShell.
В результате вот уже 2 недели как представления списков, содержащие XSL, не отпадают.
С веб-частями, содержащими XSL, ситуация не такая хорошая: на одном сайте коллекции сайтов есть две такие веб-части и они перестали отпадать, на другом сайте этой же коллекции есть одна такая веб-часть и она ежедневно отпадает (спасает пересохранение настроек веб-части).
5 марта 2014 г. 2:35 -
..... и она ежедневно отпадает (спасает пересохранение настроек веб-части) .....
Да, да , все именно так, причем могжет отвалиться как под нагрузкой, так и без нагрузки.
А ошибка в логе у вас та же сохранилась?
5 марта 2014 г. 4:36 -
Смотрим:
public XslCompiledTransform GetCompiledTransform() { if (this.transform == null) { XslCompiledTransform transform = new XslCompiledTransform(); transform.Load(base.GetMethodInfo(0), this.data, this.ebTypes); Thread.MemoryBarrier(); this.transform = transform; } return this.transform; }
На Microsoft.Xslt.MethodCollection.GetMethodInfo(Int32 methodNumber) у меня Reflector повесился :)
Далее:
private MethodInfo ResolveMethodDef(int tokenNum) { MethodInfo info = this.dynamicMethods[tokenNum]; if (info != null) { return info; } if (ForceDynamizationOfBaseMethods || this.ProtectAgainstSO) { if (this.baseMethodColl.dynamicMethods == null) { this.baseMethodColl.CreateDynamicMethods(); } if (tokenNum >= this.baseMethodColl.dynamicMethods.Length) { tokenNum = 0; } return this.baseMethodColl.dynamicMethods[tokenNum]; } return this.baseMethodColl.GetMethodInfoInternal(tokenNum); }
P.S. Попробуйте увеличить RAM на сервере раза в 1.5 - некоторым помогает, хотя при чем тут OutOfRange :(
- Изменено Maxim Shusharin 5 марта 2014 г. 8:55
- Предложено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 5 марта 2014 г. 22:24
5 марта 2014 г. 5:13 -
..... и она ежедневно отпадает (спасает пересохранение настроек веб-части) .....
Да, да , все именно так, причем могжет отвалиться как под нагрузкой, так и без нагрузки.
А ошибка в логе у вас та же сохранилась?
Да, ошибка все та же.31 марта 2014 г. 5:37 -
Увеличил время трансформации XSL на ферме с 1 до 5 секунд с помощью PowerShell.
В результате вот уже 2 недели как представления списков, содержащие XSL, не отпадают.
С веб-частями, содержащими XSL, ситуация не такая хорошая: на одном сайте коллекции сайтов есть две такие веб-части и они перестали отпадать, на другом сайте этой же коллекции есть одна такая веб-часть и она ежедневно отпадает (спасает пересохранение настроек веб-части).
Спустя несколько дней эффект пропал. Почти все веб-части и представления, содержащие XSL, снова начали "отваливаться" где-то раз в 2 дня. Никаких обновлений на серверной машине установлено не было.31 марта 2014 г. 5:41