97 votes

IIS Request Timeout sur une longue opération ASP.NET

Je rencontre un délai d'attente de la part d'IIS lorsque j'exécute une opération longue. En coulisse, mon application ASP.NET traite des données, mais le nombre d'enregistrements traités est important et l'opération prend donc beaucoup de temps.

Cependant, je pense que IIS interrompt la session. S'agit-il d'un problème de IIS ou de session ASP.NET ?

155voto

Kev Points 60744

Si vous souhaitez prolonger la durée autorisée pour un ASP.NET script à exécuter, puis augmenter le Server.ScriptTimout de la valeur. La valeur par défaut est de 90 secondes.

Par exemple:

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

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

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

enter image description here

Veuillez noter que conformément à la documentation MSDN:

"Ce délai ne s'applique que si l'attribut de débogage dans la compilation l'élément est Faux. Par conséquent, si l'attribut de débogage est Vrai, vous ne pas de définition de cet attribut à une valeur plus grande pour éviter l'arrêt de l'application lorsque vous déboguez."

Si vous avez déjà fait cela, mais sont de trouver que votre session expire, puis augmenter la ASP.NET HttpSessionState.Timeout valeur:

Par exemple:

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

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

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

Si votre script est de prendre quelques minutes pour exécuter et il y a beaucoup d'utilisateurs simultanés alors envisager de modifier la page à une Asynchrones Page. Cela permettra d'accroître l'évolutivité de votre application.

L'autre alternative, si vous disposez d'un accès administrateur au serveur, est de considérer cette opération longue à exécuter en tant que candidat pour la mise en œuvre, comme une tâche planifiée ou d'un service windows.

0 votes

Pour votre information, httpRuntime executionTimeout est exprimé en secondes et ne comporte pas de T majuscule.

8 votes

Il est également important de noter que le mode débogage doit être défini sur false pour que cette valeur de timeout soit utilisée : <system.web><compilation debug="false" targetFramework="4.0"/></system.web>.

0 votes

@JesseRoper si vous pouvez m'indiquer la documentation à ce sujet, je serais heureux de l'inclure dans la réponse, ou vous pourriez modifier ma réponse directement. Ta.

23voto

Bart Points 306

Excellente et exhaustive réponse de @Kev !

Comme je n'ai effectué un traitement long que dans une page d'administration d'une application WebForms, j'ai utilisé l'option code. Mais pour permettre une correction rapide et temporaire en production, j'ai utilisé la version config dans un fichier de type <location> dans le web.config. De cette façon, ma page d'administration/traitement dispose de suffisamment de temps, tandis que les pages destinées aux utilisateurs finaux et autres conservent leur ancien comportement en matière de délai.

J'ai donné ci-dessous la configuration pour les Googlers qui ont besoin de la même solution rapide. Vous devriez bien sûr utiliser d'autres valeurs que mon exemple de "4 heures", mais DO Notez que la session timeOut est exprimée en minutes, tandis que la demande executionTimeout est en secondes !

Et - puisque nous sommes déjà en 2015 - pour une solution NON-rapide, vous devriez utiliser la version 4.5 de .Net. async/await maintenant, si possible, au lieu de la page ASYNC de .NET 2.0 qui était à la pointe du progrès 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 votes

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

14voto

Edmundo Rodrigues Points 3004

Je poste ceci ici, parce que j'ai passé 3 ou 4 heures dessus, et je n'ai trouvé que des réponses comme celles ci-dessus, qui disent qu'il faut ajouter le executionTime mais cela ne résout pas le problème dans le cas où vous utilisez l'option ASP .NET Core . Pour lui, cela fonctionnerait :

Dans le fichier web.config, ajoutez l'élément requestTimeout attribut à aspNetCore nœud.

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

Dans cet exemple, je fixe la valeur à 10 minutes.

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

0 votes

Ceci s'applique uniquement pour OutOfProcess modèle d'hébergement. Pour InProcess il n'y a pas de paramètre de délai d'attente. IIS continuera à attendre que le processus soit terminé, référence ici : github.com/dotnet/AspNetCore.Docs/issues/16870

-11voto

sadu Points 1

Retirer ~ personnage en situation donc

path="~/Admin/SomePage.aspx"

devient

path="Admin/SomePage.aspx"

0 votes

Cela ne répond pas à la question

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X