使用 PageParserPath 指令可能导致性能问题

请考虑以下情况:

  • 您在 SharePoint 2010 或 SharePoint 2013 环境中有一个 web 应用程序,在此环境中,您已使用 web.config 文件中的 PageParserPath 指令启用了内联服务器端代码。

  • 在 PageParserPath 指令的 "VirtualPath" 属性中指定的文件夹中,可以编辑15个以上的 aspx 页。

在这种情况下,后续请求将需要较长时间才能处理。

将 PageParserPath 指令与 CompilationMode = "Always" AllowServerSideScript = "true" IncludeSubFolders = "true" 属性值结合使用时,VirtualPath 属性中指定的文件夹中的每一页将被编译为 "C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root " 作为 App_Web_GUID.dll 文件。 在 SharePoint 中编辑 aspx 页面后,该文件的上次修改日期将发生变化,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 服务器应用程序事件日志。 编辑使用 PageParserPath 指令的网站的 web.config 文件。 找到 "<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) : [日期和时间] 事件 ID:6e48fceea1194fcb9f3ff05a4eec3d68 事件序列:67事件发生次数:3事件详细信息代码:0

事件发生时间值超过15时,您将看到以下事件:

事件代码:1001事件消息:应用程序正在启动。 事件时间: [日期和时间] 事件时间 (UTC) : [日期和时间] 事件 ID:304b82ca4b764de79d42223fcbd2ac49 事件序列:1事件发生次数:1事件详细信息代码:0

这表示已重新启动应用程序池。

短期解决方案

作为短期解决方案,可以增加 ASP.NET 引擎的默认15重新编译限制,同时实现长期解决方案。

为了增加重新编译的限制,必须限制在编译元素中添加或编辑 numRecompilesBeforeAppRestart,例如:

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

有关详细信息,请参阅 (ASP.NET Settings Schema) 的编译元素

长期解决方案

将服务器端内联脚本从页面、页面布局和母版页移到服务器控件中。 使用解决方案和功能部署这些控件并删除 PageParserPath 指令。

更多信息

仍然需要帮助? 请转到 SharePoint 社区