Att använda PageParserPath-direktiv kan orsaka prestandaproblem

Tänk dig följande situation:

  • Du har ett webbprogram i SharePoint 2010 eller SharePoint 2013-miljö där du har aktiverat infogade serverbaserade koder med hjälp av pageParserPath-direktivet i web.config-filen.

  • Du kan redigera fler än 15 aspxsidor i de mappar som anges i attributet "VirtualPath" i PageParserPath-direktiv.

I det här scenariot tar det längre tid att bearbeta efterföljande förfrågningar.

När ett PageParserPath-direktiv används i kombination med CompilationMode="Always" AllowServerSideScript="true" IncludeSubFolders="true" sammanställs varje sida i mapparna med VirtualPath-attributet till "C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root som en " App_Web_GUID.dll-fil. När du har redigerat aspx-sidan i SharePoint ändras filens senaste ändring och ASP.NET sidan kompileras om. ASP.NET startar om programdomänen efter 15 omkompileringar, vilket inaktiverar alla dll-filer från minnet och kör papperssamlingen och släpper alla cachelagrade resurser. Nästa begäran initierar en ny programdomän för webbplatsen och börjar kompilera om sidorna och fylla i cacheminnen, vilket innebär att begäran tar längre tid.

Innehållsdistribution eller andra programmässiga ändringar av aspx-sidor som lagrats i innehållsdatabasen kan också orsaka ändringar under den senaste ändringstiden och så småningom kan en programdomän starta om på grund av att begränsningen för omkompilering har nåtts.

Exempel på värden i PageParserPath-direktiv, som kan orsaka det här beteendet.

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

Övervakning

Du kan aktivera loggningshändelser till webbservrarna Application Eventlog med hjälp ASP.NET infrastruktur för hälsoövervakning. Redigera web.config webbplats där ett PageParserPath-direktiv används. Leta upp <system.web> och lägg till följande rader:

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

När du redigerar en sida, som finns i en mapp som anges i attributet VirtualPath och dess ändringsdatum, ser du en händelse som liknar den här i Application Event Log:

Händelsekod: Händelsekod 1003 Händelsemeddelande: Programkompileringen startar. Händelsetid: [Datum och tid] Händelsetid (UTC): [Datum och tid] Händelse-ID: 6e48fceea1194fcb9f3ff05a4eec3d68 Händelsesekvens: 67 Händelseförekomst: 3 Händelseinformationskod: 0

När värdet för händelsehändelsen överskrider 15 ser du följande händelse:

Händelsekod: Händelsekod 1001 Händelsemeddelande: Programmet startar. Händelsetid: [Datum och tid] Händelsetid (UTC): [Datum och tid] Händelse-ID: 304b82ca4b764de79d42223fcbd2ac49 Händelsesekvens: 1 Händelseförekomst: 1 Händelseinformationskod: 0

Det här anger att programpoolen startats om.

Short-term Solution

Som en kort lösning är det möjligt att höja standardgränsen på 15 omkompilering för ASP.NET medan en långsiktig lösning implementeras.

För att du ska kunna öka kompilera måste du begränsa att numRecompilesBeforeAppRestart läggs till eller redigeras i sammanställningselementet, till exempel:

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

Mer information finns i ASP.NET (Schema för ASP.NET).

Långsiktig lösning

Flytta infogade skript på serversidan från sidorna, sidlayouterna och huvudsidorna till serverkontroller. Distribuera de här kontrollerna med hjälp av lösningar och funktioner och ta bort direktiv för PageParserPath.

Mer information

Behöver du fortfarande hjälp? Gå till SharePoint Community.