L’utilisation de la directive PageParserPath peut entraîner des problèmes de performances

Prenons l’exemple du scénario suivant :

  • Vous disposez d’une application web dans un environnement SharePoint 2010 ou SharePoint 2013 dans lequel vous avez activé le code côté serveur inline à l’aide de la directive PageParserPath dans le fichier web.config.

  • Vous modifiez plus de 15 pages aspx dans les dossiers spécifiés dans l’attribut « VirtualPath » des directives PageParserPath.

Dans ce scénario, le traitement des demandes suivantes prend plus de temps.

Lorsque la directive PageParserPath est utilisée en combinaison avec les valeurs de propriété CompilationMode="Always » AllowServerSideScript="true » IncludeSubFolders="true », chaque page des dossiers spécifiés dans l’attribut VirtualPath est compilée dans « C :\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root » en tant que fichier App_Web_GUID.dll. Une fois que vous avez modifié la page aspx dans SharePoint, la date de dernière modification du fichier change et ASP.NET recompilez la page. ASP.NET redémarre le domaine d’application après 15 recompilations, ce qui décharge toutes les DLL de la mémoire et exécute le garbage collection et libère toutes les ressources mises en cache. La requête suivante initialise un nouveau domaine d’application pour le site web et commence à compiler les pages et à remplir à nouveau les caches. Par conséquent, la requête prendra plus de temps.

Le déploiement de contenu ou toute autre modification programmatique des pages aspx stockées dans la base de données de contenu peut également entraîner des modifications lors de la dernière modification et éventuellement un redémarrage du domaine d’application en raison d’une limite de recompilation atteinte.

Exemples de valeurs de directive PageParserPath, qui peuvent provoquer ce comportement.

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

Analyse

Vous pouvez activer la journalisation des événements dans le journal des événements des applications des serveurs web à l’aide de ASP.NET’infrastructure de surveillance de l’intégrité. Modifiez le fichier web.config du site où la directive PageParserPath est utilisée. Recherchez la <section system.web> et ajoutez les lignes suivantes :

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

Une fois que vous avez modifié une page, qui se trouve dans un dossier spécifié dans l’attribut VirtualPath et que sa date de modification a changé, vous voyez un événement similaire à celui-ci dans le journal des événements de l’application :

Code d’événement : 1003 Message d’événement : La compilation de l’application démarre. Heure de l’événement : [Date et heure] Heure de l’événement (UTC) : [Date et heure] ID d’événement : 6e48fceea1194fcb9f3ff05a4eec3d68 Séquence d’événements : 67 Occurrence de l’événement : 3 Code de détail de l’événement : 0

Une fois que la valeur d’occurrence d’événement dépasse 15, l’événement suivant s’affiche :

Code d’événement : 1001 Message d’événement : L’application démarre. Heure de l’événement : [Date et heure] Heure de l’événement (UTC) : [Date et heure] ID d’événement : 304b82ca4b764de79d42223fcbd2ac49 Séquence d’événements : 1 Occurrence de l’événement : 1 Code détail de l’événement : 0

Cela indique que le pool d’applications a été redémarré.

Solution à court terme

En tant que solution à court terme, il est possible d’augmenter la limite de 15 recompilation par défaut pour le moteur de ASP.NET pendant qu’une solution à long terme est implémentée.

Pour augmenter la recompilation, limitez l’ajout ou la modification de numRecompilesBeforeAppRestart dans l’élément de compilation, par exemple :

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

Pour plus d’informations, consultez Compilation Element (schéma des paramètres ASP.NET).

Solution à long terme

Déplacez les scripts inline côté serveur des pages, mises en page et master pages dans les contrôles serveur. Déployez ces contrôles à l’aide de solutions et de fonctionnalités et supprimez la directive PageParserPath.

Informations supplémentaires

Encore besoin d’aide ? Accédez au site de la Communauté SharePoint.