2010-09-30 16 views
70

Si verifica un timeout della richiesta da IIS quando si esegue un'operazione lunga. Dietro la scena, l'applicazione ASP.NET sta elaborando i dati, ma il numero di record elaborati è ampio e quindi l'operazione richiede molto tempo.Timeout richiesta IIS su operazione ASP.NET lunga

Tuttavia, penso che IIS termini la sessione. Si tratta di un problema con la sessione IIS o ASP.NET?

Grazie in anticipo

risposta

123

Se si desidera estendere il periodo di tempo consentito per uno script ASP.NET per eseguire quindi aumentare il valore Server.ScriptTimeout. Il valore predefinito è 90 secondi per .NET 1.xe 110 secondi per .NET 2.0 e versioni successive.

Ad esempio:

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

Questo valore può anche essere configurato nel file web.config nel elemento di configurazione httpRuntime:

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

enter image description here

Si prega di notare in base alla MSDN documentation:

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

Se hai già fatto questo, ma sono trovando che la sessione è in scadenza quindi aumentare la ASP.NET HttpSessionState.Timeout valore:

Ad esempio:

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

Questo valore può anche essere configurato nel file web.config in t egli sessionState elemento di configurazione:

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

Se lo script sta prendendo diversi minuti per eseguire e ci sono molti utenti simultanei poi pensare di cambiare la pagina per un Asynchronous Page. Ciò aumenterà la scalabilità della tua applicazione.

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

+0

FYI httpRuntime executionTimeout è espresso in secondi e non ha alcun maiuscolo T –

+6

E 'anche importante notare che la modalità di debug essere impostata su false in modo che questo valore di timeout da utilizzare:

+0

@JesseRoper se puoi indicarmi i documenti in merito, sarei lieto di includerlo nella risposta o di modificare direttamente la risposta. Ta. – Kev

17

Risposta esauriente ed esaustiva @Kev!

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

Di seguito ho fornito la configurazione per i googler che hanno bisogno della stessa soluzione rapida.Ovviamente dovresti usare valori diversi dal mio esempio di "4 ore", ma DO nota che la sessione timeOut è in minuti, mentre la richiesta executionTimeout è in secondi!

E - dal momento che è già il 2015 - per un NON-quickfix dovresti usare .Net 4.5's async/await ora se possibile, invece della pagina ASYNC di .NET 2.0 che era allo 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> 
+0

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 il timeout correttamente in tutte le pagine. – Oliver

-2

Rimuovere ~ personaggio in posizione così

path="~/Admin/SomePage.aspx" 

diventa

path="Admin/SomePage.aspx" 
2

sto postando questo qui, perché ho passato come 3 e 4 ore su di esso, e Ho trovato solo risposte come quelle sopra indicate, che aggiungo lo executionTime, ma non risolve il problema nel caso in cui tu stia usando ASP .NET Core. Per farlo, funzionerebbe:

Nel file web.config, aggiungere l'attributo requestTimeout al nodo aspNetCore.

<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