web-dev-qa-db-fra.com

IIS Délai d'attente de la requête lors d'une opération ASP.NET longue

Je rencontre une temporisation de demande de IIS lorsque j'exécute une longue opération. 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 donc l'opération. prend beaucoup de temps.

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

Merci d'avance

80
Tachi

Si vous souhaitez prolonger la durée d'exécution d'un script ASP.NET, augmentez 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ée 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

Veuillez noter selon le documentation MSDN :

Msgstr "" "Ce délai ne s'applique que si l'attribut debug de l'élément de compilation est False. Par conséquent, si l'attribut debug est 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 que votre session arrive à expiration, augmentez ASP.NET HttpSessionState.Timeout valeur:

Par exemple:

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

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

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

Si l'exécution de votre script prend plusieurs minutes et qu'il y a de nombreux utilisateurs simultanés, envisagez de modifier la page en Page asynchrone . Cela augmentera l'évolutivité de votre application.

Si vous avez un accès administrateur au serveur, vous pouvez également considérer cette opération longue comme un candidat à implémenter en tant que tâche planifiée ou service Windows.

140
Kev

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

Depuis que j'ai traité longtemps dans une seule page d'administrateur 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 de configuration dans un fichier <location> balise dans web.config. De cette façon, ma page d’administration/de traitement disposait de suffisamment de temps, alors que les pages destinées aux utilisateurs finaux conservaient leur ancien comportement de délai d’attente.

Ci-dessous, j'ai donné la configuration pour vous. Les utilisateurs de Google ont besoin de la même solution rapide. Vous devriez bien sûr utiliser d'autres valeurs que mon exemple de "4 heures", mais [~ # ~] faire [~ # ~] notez que la session timeOut est en minutes, alors que la demande executionTimeout est en secondes!

Et - comme nous sommes déjà en 2015 - pour un correctif rapide, vous devez utiliser .Net 4.5 async/wait maintenant si possible, au lieu de la page ASYNC du .NET 2.0 qui était à l'état de l'art quand 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>
20
Bart

Je poste ceci ici, parce que j'ai passé entre 3 et 4 heures dessus et que je n'ai trouvé que des réponses comme celles ci-dessus, c'est-à-dire 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'attribut requestTimeout au nœud aspNetCore.

<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

8
Edmundo Rodrigues