Timeout richiesta IIS per operazioni ASP.NET lunghe


87

Si verifica un timeout della richiesta da IIS quando eseguo un'operazione lunga. Dietro le quinte la mia applicazione ASP.NET sta elaborando i dati, ma il numero di record in elaborazione è elevato e quindi l'operazione richiede molto tempo.

Tuttavia, penso che IIS scada la sessione. È un problema con la sessione IIS o ASP.NET?

Grazie in anticipo

Risposte:


146

Se si desidera estendere la quantità di tempo consentita per l'esecuzione di uno script ASP.NET, aumentare il Server.ScriptTimeoutvalore. L'impostazione predefinita è 90 secondi per .NET 1.xe 110 secondi per .NET 2.0 e versioni successive.

Per esempio:

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

Questo valore può anche essere configurato nel tuo web.configfile nell'elemento di httpRuntimeconfigurazione:

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

inserisci qui la descrizione dell'immagine

Si prega di notare in base alla documentazione MSDN :

"Questo timeout si applica solo se l'attributo debug nell'elemento di compilazione è False. Pertanto, se l'attributo debug è True, non è necessario impostare questo attributo su un valore elevato per evitare l'arresto dell'applicazione durante il debug. "

Se l'hai già fatto ma stai scoprendo che la tua sessione sta scadendo, aumenta il HttpSessionState.Timeoutvalore ASP.NET :

Per esempio:

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

Questo valore può anche essere configurato nel tuo web.configfile nell'elemento di sessionStateconfigurazione:

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

Se l'esecuzione dello script richiede diversi minuti e sono presenti molti utenti simultanei, valutare la possibilità di modificare la pagina in una pagina asincrona . Ciò aumenterà la scalabilità della tua applicazione.

L'altra alternativa, se si dispone dell'accesso come amministratore al server, è considerare questa operazione di lunga durata come candidata per l'implementazione come attività pianificata o servizio Windows.


FYI httpRuntime executionTimeout è in secondi e non ha T maiuscola
Andrew Rimmer,

7
È anche importante notare che la modalità di debug deve essere impostata su false per poter utilizzare questo valore di timeout: <system.web> <compilation debug = "false" targetFramework = "4.0" /> </ system.web>
Jesse Roper

@ JesseRoper se puoi indicarmi i documenti su questo, sarei felice di includerlo nella risposta, oppure potresti modificare direttamente la mia risposta. Ta.
Kev

Il valore di executionTimeout predefinito è 110 secondi.
frattaro

20

Ottima ed esauriente risposta di @Kev!

Dato che ho elaborato a lungo solo in una pagina di amministrazione in un'applicazione WebForms, ho utilizzato l'opzione codice. Ma per consentire una soluzione rapida temporanea in produzione, ho utilizzato la versione di configurazione in un <location>tag in web.config. In questo modo la mia pagina di amministrazione / elaborazione ha avuto abbastanza tempo, mentre le pagine per gli utenti finali e simili hanno mantenuto il loro vecchio comportamento di timeout.

Di seguito ho fornito la configurazione per voi googler che necessitano della stessa soluzione rapida. Ovviamente dovresti usare valori diversi dal mio esempio "4 ore", ma FACCIA notare che la sessione timeOutè in minuti, mentre la richiesta executionTimeoutè in secondi!

E - dato che è già il 2015 - per un NON-quickfix dovresti usare async / await di .Net 4.5 se possibile, invece della pagina ASYNC di .NET 2.0 che era lo stato dell'arte quando KEV ha risposto nel 2010 :).

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

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

Ho incluso lo snippet "location" nel mio web.config ma non funziona. Sto usando solo "executionTimeout", non ho bisogno di "sessionState". Devo configurare qualcos'altro. Sto usando NET 4.0. Se uso "httpRuntime" direttamente in "system.web" applica correttamente il timeout in tutte le pagine.
Oliver

11

Lo sto postando qui, perché ci ho passato 3 e 4 ore e ho trovato solo risposte come quelle sopra, che dicono di aggiungere il executionTime, ma non risolve il problema nel caso in cui stai usando ASP .NET Core . Per questo, questo funzionerebbe:

Nel file web.config, aggiungi l' requestTimeoutattributo in aspNetCorenode.

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

In questo esempio, sto impostando il valore per 10 minuti.

Riferimento: https://docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module#configuring-the-asp-net-core-module


Questo vale solo per il OutOfProcessmodello di hosting. Perché InProcessnon c'è l'impostazione del timeout. IIS continuerà ad attendere il completamento del processo, fare riferimento qui: github.com/dotnet/AspNetCore.Docs/issues/16870
Rosdi Kasim,

-9

Rimuovi il ~personaggio nella posizione così

path="~/Admin/SomePage.aspx"

diventa

path="Admin/SomePage.aspx"

Non risponde alla domanda
Igor
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.