Zeitlimit für IIS-Anforderungen bei langem ASP.NET-Betrieb

86

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 dauert der Vorgang lange.

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

Danke im Voraus

Tachi
quelle

Antworten:

145

Wenn Sie die Ausführungszeit eines ASP.NET-Skripts verlängern möchten, erhöhen Sie den Server.ScriptTimeoutWert. 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.configDatei im httpRuntimeKonfigurationselement konfiguriert werden:

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

Geben Sie hier die Bildbeschreibung ein

Bitte beachten Sie gemäß der MSDN-Dokumentation :

"Dieses Zeitlimit gilt nur, wenn das Debug-Attribut im Kompilierungselement False ist. Wenn das Debug-Attribut also True ist, müssen Sie dieses Attribut nicht auf einen großen Wert festlegen, 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 ASP.NET- HttpSessionState.TimeoutWert:

Beispielsweise:

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

Dieser Wert kann auch in Ihrer web.configDatei im sessionStateKonfigurationselement 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 viele Benutzer gleichzeitig arbeiten, sollten Sie die Seite in eine asynchrone Seite ändern . Dies erhöht die Skalierbarkeit Ihrer Anwendung.

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

Kev
quelle
Zu Ihrer Information httpRuntime ExecutionTimeout ist in Sekunden und hat keine Großbuchstaben T
Andrew Rimmer
7
Es ist auch wichtig zu beachten, dass der Debug-Modus auf false gesetzt ist, damit dieser Timeout-Wert verwendet werden kann: <system.web> <compilation debug = "false" targetFramework = "4.0" /> </ system.web>
Jesse Roper
@JesseRoper Wenn Sie mich auf die Dokumente dazu verweisen können, würde ich das gerne in die Antwort aufnehmen, oder Sie könnten meine Antwort direkt bearbeiten. Ta.
Kev
Der Standardwert für ExecutionTimeout beträgt 110 Sekunden.
Frattaro
20

Tolle und umfassende Antwort von @Kev!

Da ich in einer WebForms-Anwendung nur auf einer Administrationsseite lange verarbeitet habe, habe ich die Codeoption verwendet. 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 verwendet. Auf diese Weise bekam meine Administrator- / Verarbeitungsseite genügend Zeit, während Seiten für Endbenutzer und dergleichen ihr altes Timeout-Verhalten beibehielten.

Unten habe ich die Konfiguration für Googler angegeben, die dieselbe schnelle Lösung benötigen. Sie sollten natürlich andere Werte als meine ‚4 Stunden‘ Beispiel verwenden, aber DO zur Kenntnis , dass die Sitzung timeOutin Minuten, während die Anfrage executionTimeoutin Sekunden!

Und - da es 2015 ist bereits - für ein nicht quickfix sollten Sie .Net 4.5 die Nutzung async / await jetzt , wenn überhaupt möglich, statt dem Asynchron - Seite .NET 2.0 , den Stand der Technik war , als KEV 2010 beantwortet :).

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

    <location path="~/Admin/SomePage.aspx">
        <system.web>
            <sessionState timeout="240" />
            <httpRuntime executionTimeout="14400" />
        </system.web>
    </location>
    ...
</configuration>
Bart
quelle
Ich habe das Snipet "location" in meine web.config aufgenommen, aber es funktioniert nicht. Ich verwende nur "executeTimeout", ich brauche nicht "sessionState". Muss ich etwas anderes konfigurieren? Ich benutze NET 4.0. Wenn ich "httpRuntime" direkt in "system.web" verwende, wird das Timeout auf allen Seiten korrekt angewendet.
Oliver
11

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

Fügen Sie in der Datei web.config das requestTimeoutAttribut am aspNetCoreKnoten 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

Edmundo Rodrigues
quelle
Dies gilt nur für das OutOfProcessHosting-Modell. Denn InProcesses gibt keine Timeout-Einstellung. IIS wartet weiter auf den Abschluss des Prozesses. Weitere
Informationen finden Sie
-9

Entfernen Sie das ~Zeichen an der richtigen Stelle

path="~/Admin/SomePage.aspx"

wird

path="Admin/SomePage.aspx"
Sadu
quelle
Es beantwortet die Frage nicht
Igor