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

请考虑以下情况:

  • 在 SharePoint 2010 或 SharePoint 2013 环境中,已使用 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>

监控

您可以使用运行状况监控基础结构将日志记录事件启用到 Web 服务器 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) :[日期和时间] 事件 ID:6e48fceea1194fcb9f3ff05a4eec3d68 事件序列:67 事件事件:3 个事件详细信息代码:0

事件发生值超过 15 后,你将看到以下事件:

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

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

短期解决方案

作为短期解决方案,在长期解决方案实施期间,可能会提高 ASP.NET 引擎的默认重新编译限制。

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

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

有关详细信息,请参阅 Compilation Element (ASP.NET 设置 Schema) 。

长期解决方案

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

更多信息

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