none
Периодически "отпадают" веб-части и кастомные представления списков, содержащие XSL RRS feed

  • Вопрос

  • Доброго времени суток.

    В последнее время на страницах сайта 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 на разных сайтах, сайт-коллекциях, фермах. Бывает, что код не работает на конкретной сайт-коллекции.

    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 на разных сайтах, сайт-коллекциях, фермах. Бывает, что код не работает на конкретной сайт-коллекции.

    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 :(



    5 марта 2014 г. 5:13
  • ..... и она ежедневно отпадает (спасает пересохранение настроек веб-части) .....

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

    А ошибка в логе у вас та же сохранилась?


    Да, ошибка все та же.
    31 марта 2014 г. 5:37
  • Увеличил время трансформации XSL на ферме с 1 до 5 секунд с помощью PowerShell.

    В результате вот уже 2 недели как представления списков, содержащие XSL, не отпадают.

    С веб-частями, содержащими XSL, ситуация не такая хорошая: на одном сайте коллекции сайтов есть две такие веб-части и они перестали отпадать, на другом сайте этой же коллекции есть одна такая веб-часть и она ежедневно отпадает (спасает пересохранение настроек веб-части).


    Спустя несколько дней эффект пропал. Почти все веб-части и представления, содержащие XSL, снова начали "отваливаться" где-то раз в 2 дня. Никаких обновлений на серверной машине установлено не было.
    31 марта 2014 г. 5:41