Délai d'expiration de la demande IIS sur une longue opération ASP.NET

87

Je rencontre un délai d'expiration de demande 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 en cours de traitement est important et l'opération prend donc beaucoup de temps.

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

Merci d'avance

Tachi
la source

Réponses:

146

Si vous souhaitez prolonger la durée autorisée pour l'exécution d'un script ASP.NET, augmentez la Server.ScriptTimeoutvaleur. 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ée dans votre web.configfichier dans l' httpRuntimeélément de configuration:

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

entrez la description de l'image ici

Veuillez noter selon la documentation MSDN :

"Ce délai d'expiration s'applique uniquement si l'attribut de débogage dans l'élément de compilation est False. Par conséquent, si l'attribut de débogage a la valeur True, vous ne devez pas définir cet attribut sur une valeur élevée pour éviter l'arrêt de l'application pendant le débogage. "

Si vous avez déjà fait cela mais constatez que votre session expire, augmentez la HttpSessionState.Timeoutvaleur ASP.NET :

Par exemple:

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

Cette valeur peut également être configurée dans votre web.configfichier dans l' sessionStateélément de configuration:

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

Si votre script prend plusieurs minutes à s'exécuter et qu'il existe de nombreux utilisateurs simultanés, envisagez de changer la page en une page asynchrone . 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 de longue durée comme un candidat pour l'implémentation en tant que tâche planifiée ou service Windows.

Kev
la source
FYI httpRuntime executionTimeout est en secondes et n'a pas de T majuscule
Andrew Rimmer
7
Il est également important de noter que le mode de débogage doit être défini sur false pour que cette valeur de délai d'expiration soit utilisée: <system.web> <compilation debug = "false" targetFramework = "4.0" /> </ system.web>
Jesse Roper
@JesseRoper si vous pouvez me diriger vers la documentation à ce sujet, je serais heureux de l'inclure dans la réponse, ou vous pouvez modifier ma réponse directement. Ta.
Kev
La valeur d'exécution par défaut est de 110 secondes.
frattaro
20

Réponse géniale et exhaustive par @Kev!

Comme j'ai effectué un long traitement dans une seule page d'administration dans une application WebForms, j'ai utilisé l'option code. Mais pour permettre une correction rapide temporaire sur la production, j'ai utilisé la version de configuration dans une <location>balise dans web.config. De cette façon, ma page d'administration / de traitement a eu suffisamment de temps, tandis que les pages destinées aux utilisateurs finaux et autres ont conservé leur ancien comportement de temporisation.

Ci-dessous, j'ai donné la configuration pour vous, les Googleurs ayant besoin de la même solution rapide. Vous devez utiliser d' autres valeurs ofcourse que mon exemple « 4 heures », mais DO noter que la session timeOutest en quelques minutes, alors que la demande executionTimeoutest en quelques secondes

Et - puisque nous sommes déjà en 2015 - pour un correctif non rapide, vous devriez utiliser async / await de .Net 4.5 si possible, au lieu de la page ASYNC de .NET 2.0 qui était à la pointe de la technologie 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>
Bart
la source
J'ai inclus l'extrait de code "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 correctement le délai d'attente dans toutes les pages.
Oliver le
11

Je poste ceci ici, parce que j'ai passé environ 3 et 4 heures dessus, et je n'ai trouvé que 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:

Dans le fichier web.config, ajoutez l' requestTimeoutattribut au aspNetCorenœud.

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

Dans cet exemple, je règle la valeur sur 10 minutes.

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

Edmundo Rodrigues
la source
Cela s'applique uniquement au OutOfProcessmodèle d'hébergement. Car InProcessil n'y a pas de paramètre de délai. IIS continuera d'attendre la fin du processus, référence ici: github.com/dotnet/AspNetCore.Docs/issues/16870
Rosdi Kasim le
-9

Supprimer le ~caractère à l'emplacement pour

path="~/Admin/SomePage.aspx"

devient

path="Admin/SomePage.aspx"
Sadu
la source
Cela ne répond pas à la question
Igor