wake-up-neo.com

IIS Request Timeout bei langer ASP.NET-Operation

Beim Ausführen eines langen Vorgangs tritt ein Anforderungszeitlimit von IIS=) auf. Hinter den Kulissen verarbeitet meine ASP.NET-Anwendung Daten, aber die Anzahl der verarbeiteten Datensätze ist groß, und daher der Vorgang dauert lange.

Ich denke jedoch, dass IIS die Sitzung zeitlich begrenzt. Ist dies ein Problem mit IIS oder ASP.NET-Sitzung?

Danke im Voraus

80
Tachi

Wenn Sie die Zeitspanne für die Ausführung eines ASP.NET-Skripts verlängern möchten, erhöhen Sie den Wert Server.ScriptTimeout . Der Standardwert beträgt 90 Sekunden für .NET 1.x und 110 Sekunden für .NET 2.0 und höher.

Beispielsweise:

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

Dieser Wert kann auch in Ihrer web.config - Datei im Konfigurationselement httpRuntime konfiguriert werden:

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

enter image description here

Bitte beachten Sie laut MSDN-Dokumentation :

"Dieses Zeitlimit gilt nur, wenn das Debugattribut im Kompilierungselement" False "ist. Wenn das Debugattribut" True "ist, müssen Sie dieses Attribut nicht auf einen großen Wert setzen, um ein Herunterfahren der Anwendung während des Debuggens zu vermeiden. "

Wenn Sie dies bereits getan haben, aber feststellen, dass Ihre Sitzung abläuft, erhöhen Sie den Wert für ASP.NET HttpSessionState.Timeout :

Beispielsweise:

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

Dieser Wert kann auch in Ihrer web.config - Datei im Konfigurationselement sessionState konfiguriert werden:

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

Wenn die Ausführung Ihres Skripts einige Minuten dauert und es viele gleichzeitige Benutzer gibt, sollten Sie die Seite in eine asynchrone Seite ändern. Dies erhöht die Skalierbarkeit Ihrer Anwendung.

Die andere Alternative, wenn Sie über Administratorzugriff auf den Server verfügen, besteht darin, diesen lang andauernden Vorgang als Kandidaten für die Implementierung als geplante Aufgabe oder als Windows-Dienst zu betrachten.

140
Kev

Großartige und umfassende Antwort von @ Kev!

Da ich in einer WebForms-Anwendung lange nur auf einer Admin-Seite gearbeitet habe, habe ich die Code-Option verwendet. Aber um eine vorübergehende schnelle Lösung für die Produktion zu ermöglichen, habe ich die Konfigurationsversion in einem <location> Tag in web.config. Auf diese Weise bekam meine Administrations-/Verarbeitungsseite genügend Zeit, während Seiten für Endbenutzer und dergleichen ihr altes Timeout-Verhalten beibehielten.

Im Folgenden habe ich die Konfiguration für Sie Googler gegeben, die die gleiche schnelle Lösung benötigen. Sie sollten natürlich andere Werte als in meinem Beispiel "4 Stunden" verwenden, aber [~ # ~] machen Sie [~ # ~] , dass die Sitzung timeOut ist in Minuten, während die Anfrage executionTimeout in Sekunden ist!

Und - da es bereits 2015 ist - sollten Sie für ein NICHT-Quickfix .Net 4.5s async/await jetzt verwenden, wenn dies überhaupt möglich ist, anstatt der ASYNC-Seite von .NET 2.0, die den Status "state of" hat Die Kunst, als KEV 2010 antwortete :).

<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

Ich poste dies hier, weil ich ungefähr 3 und 4 Stunden damit verbracht habe, und ich habe nur Antworten wie die oben genannten gefunden, die sagen, füge das executionTime hinzu, aber es löst sich nicht das Problem in dem Fall, dass Sie ASP .NET Core verwenden. Dafür würde das funktionieren:

Fügen Sie in der Datei web.config das Attribut requestTimeout am Knoten aspNetCore hinzu.

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

In diesem Beispiel stelle ich den Wert auf 10 Minuten ein.

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

8