2010-09-30 13 views
70

Je rencontre un délai d'attente de requête de la part d'IIS lorsque j'exécute une opération longue. Derrière la scène, mon application ASP.NET traite des données, mais le nombre d'enregistrements en cours de traitement est important et l'opération prend donc beaucoup de temps.Délai de requête IIS sur une opération ASP.NET longue durée

Cependant, je pense que IIS expire la session. Est-ce un problème avec IIS ou session ASP.NET?

Merci à l'avance

Répondre

123

Si vous souhaitez prolonger la durée autorisée pour un script ASP.NET pour exécuter augmenter la valeur Server.ScriptTimeout. La valeur par défaut est 90 secondes pour .NET 1.x et 110 secondes pour .NET 2.0 et versions ultérieures.

Par exemple:

// Increase script timeout for current page to five minutes 
Server.ScriptTimeout = 300; 

Cette valeur peut également être configuré dans votre fichier web.config dans l'élément de configuration httpRuntime:

<!-- Increase script timeout to five minutes --> 
<httpRuntime executionTimeout="300" 
    ... other configuration attributes ... 
/> 

enter image description here

S'il vous plaît noter selon le MSDN documentation:

"Ce délai d'attente s'applique uniquement si l'attribut de débogage de l'élément de compilation est False. Par conséquent, si l'attribut de débogage est vrai, vous ne avez pas définir cet attribut à une grande valeur afin d'éviter l'arrêt de l'application pendant que vous déboguez. »

Si vous avez déjà fait cela, mais êtes constatant que votre session est expirant, puis augmenter le ASP.NET valeur HttpSessionState.Timeout:

Par exemple:

// Increase session timeout to thirty minutes 
Session.Timeout = 30; 

Cette valeur peut également être configuré dans votre fichier web.config en t il sessionState élément de configuration:

<configuration> 
    <system.web> 
    <sessionState 
     mode="InProc" 
     cookieless="true" 
     timeout="30" /> 
    </system.web> 
</configuration> 

Si votre script prend plusieurs minutes pour exécuter et il y a beaucoup d'utilisateurs simultanés alors envisager de changer la page à un Asynchronous Page. Cela augmentera l'évolutivité de votre application. L'autre alternative, si vous avez un accès administrateur au serveur, est de considérer cette opération longue comme un candidat à l'implémentation en tant que tâche planifiée ou service Windows.

+0

Pour votre information httpRuntime executionTimeout est en quelques secondes et n'a pas en majuscules T –

+6

Il est également important de noter que le mode de débogage est défini sur false pour que cette valeur de délai d'attente à utiliser:

+0

@JesseRoper Si vous pouvez me diriger vers les docs sur ce point, je serais heureux de l'inclure dans la réponse, ou vous pourriez éditer ma réponse directement. Ta. – Kev

17

Grande et exhaustive answerby @Kev!

Étant donné que j'ai effectué un long traitement uniquement dans une page d'administration dans une application WebForms, j'ai utilisé l'option de code. Mais pour permettre une solution rapide temporaire sur la production, j'ai utilisé la version config dans une balise <location> dans web.config. De cette façon, ma page d'administration/de traitement a eu assez de temps, alors que les pages pour les utilisateurs finaux et autres ont conservé leur ancien comportement de temporisation. Ci-dessous, j'ai donné la configuration pour vous les Googleurs qui ont besoin de la même solution rapide.Vous devriez bien sûr utiliser d'autres valeurs que mon exemple '4 heures', mais DO notez que la session timeOut est en minutes, alors que la demande executionTimeout est en secondes! Et, puisque nous sommes déjà en 2015, pour un NON-quickfix, utilisez maintenant async/await de .Net 4.5 maintenant si possible, au lieu de la page ASYNC du .NET 2.0 qui était l'état de l'art lorsque KEV a répondu en 2010 :).

<configuration> 
    ... 
    <compilation debug="false" ...> 
    ... other stuff .. 

    <location path="~/Admin/SomePage.aspx"> 
     <system.web> 
      <sessionState timeout="240" /> 
      <httpRuntime executionTimeout="14400" /> 
     </system.web> 
    </location> 
    ... 
</configuration> 
+0

J'ai inclus l'extrait "location" dans mon web.config mais cela ne fonctionne pas. J'utilise "executionTimeout" seulement, je n'ai pas besoin de "sessionState". Dois-je configurer quelque chose d'autre? J'utilise NET 4.0. Si j'utilise "httpRuntime" directement dans "system.web", il applique correctement le délai sur toutes les pages. – Oliver

-2

Retirer ~ caractère dans un endroit si

path="~/Admin/SomePage.aspx" 

devient

path="Admin/SomePage.aspx" 
2

je poste ce ici, parce que je l'ai passé comme 3 et 4 heures, et J'ai seulement trouvé des réponses comme celles ci-dessus, qui disent ajouter le executionTime, mais cela ne résout pas le problème dans le cas où vous utilisez ASP .NET Core. Pour cela, cela fonctionnerait:

Au fichier web.config, ajoutez l'attribut requestTimeout au nœud aspNetCore.

<system.webServer> 
    <aspNetCore requestTimeout="00:10:00" ... (other configs goes here) /> 
</system.webServer> 

Dans cet exemple, je définis la valeur pendant 10 minutes.

Référence: https://docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module#configuring-the-asp-net-core-module

Questions connexes