Использование директивы PageParserPath может вызвать проблемы с производительностью

Рассмотрим следующий сценарий.

  • У вас есть веб-приложение в среде SharePoint 2010 или SharePoint 2013, в котором вы включили встроенный серверный код с помощью директивы PageParserPath в файле web.config.

  • Вы редактируете более 15 страниц aspx в папках, указанных в атрибуте VirtualPath директив PageParserPath.

В этом сценарии обработка последующих запросов займет больше времени.

Если директива PageParserPath используется в сочетании со значениями свойств CompilMode="Always" AllowServerSideScript="true" IncludeSubFolders="true", каждая страница в папках, указанных в атрибуте VirtualPath, будет компилироваться в "C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root" в качестве файла App_Web_GUID.dll. После изменения страницы aspx в SharePoint дата последнего изменения файла изменится, и ASP.NET будет повторно компилировать страницу. ASP.NET перезапустит домен приложения после 15 перекомпиляций, что выгрузит все библиотеки DLL из памяти и запустит сборку мусора и выпустит все кэшированные ресурсы. Следующий запрос инициализирует новый домен приложения для веб-сайта и начнет компилировать страницы и повторно заполнять кэши, поэтому запрос займет больше времени.

Развертывание содержимого или другое программное изменение страниц aspx, хранящихся в базе данных контента, также может привести к изменениям в последнее время изменения и в конечном итоге перезапуск домена приложения из-за достигнутого предела перекомпиляции.

Пример значений директив PageParserPath, которые могут привести к такому поведению.

<SafeMode MaxControls="200" CallStack="false" DirectFileDependencies="10" TotalFileDependencies="50" AllowPageLevelTrace="false">
      <PageParserPaths>
 <PageParserPath VirtualPath="/_catalogs/masterpage/*" CompilationMode="Always" AllowServerSideScript="true" IncludeSubFolders="true"/>
 <PageParserPath VirtualPath="/pages/*" CompilationMode="Always" AllowServerSideScript="true" IncludeSubFolders="true"/>
 <PageParserPath VirtualPath="/*" CompilationMode="Always" AllowServerSideScript="true" IncludeSubFolders="true"/>
      </PageParserPaths>
    </SafeMode>

Мониторинг

Вы можете включить запись событий в журнал событий приложений веб-серверов с помощью инфраструктуры мониторинга работоспособности ASP.NET. Измените файл web.config сайта, на котором используется директива PageParserPath. <Найдите раздел system.web> и добавьте следующие строки:

<healthMonitoring>
   <rules>
   <add name="Application Events"
       eventName="Application Lifetime Events"
       provider="EventLogProvider"
       profile="Default"
       minInterval="00:01:00" />
   </rules>
</healthMonitoring>

После изменения страницы, которая находится в папке, указанной в атрибуте VirtualPath, и изменения даты ее изменения, в журнале событий приложений появится событие, аналогичное следующему:

Код события: 1003 Сообщение о событии: начинается компиляция приложения. Время события: [Дата и время] Время события (UTC): [Дата и время] Идентификатор события: 6e48fceea1194fcb9f3ff05a4eec3d68 Последовательность событий: 67 Вхождение события: 3 Код сведений о событии: 0

Когда значение вхождения события превысит 15, вы увидите следующее событие:

Код события: 1001 Сообщение о событии: приложение запускается. Время события: [Дата и время] Время события (UTC): [Дата и время] Идентификатор события: 304b82ca4b764de79d42223fcbd2ac49 Последовательность событий: 1 Событие вхождения: 1 Код сведений о событии: 0

Это означает, что пул приложений был перезапущен.

Краткосрочное решение

В качестве краткосрочного решения можно увеличить предел перекомпиляции по умолчанию в 15 для подсистемы ASP.NET, пока реализовано долгосрочное решение.

Чтобы увеличить повторную компиляцию, ограничьте добавление или изменение numRecompilesBeforeAppRestart в элементе компиляции, например:

<compilation debug="false" numRecompilesBeforeAppRestart="50" />

Дополнительные сведения см. в разделе Элемент Компиляция (схема параметров ASP.NET).

Долгосрочное решение

Переместите встроенные скрипты на стороне сервера со страниц, макетов страниц и master страниц в серверные элементы управления. Разверните эти элементы управления с помощью решений и функций и удалите директиву PageParserPath.

Дополнительная информация

Требуется дополнительная помощь? Посетите сайт сообщества SharePoint.