it-swarm.com.de

Festlegen verschiedener Zeitlimits für verschiedene URLs in ASP.NET

Ich möchte unterschiedliche Verbindungslimits für einige URLs in meiner Anwendung. Einige URLs akzeptieren Datei-Uploads und benötigen ein großes Verbindungs-Timeout. Alle anderen URLs benötigen eine viel kürzere Zeitspanne, um den Denial-of-Service zu verhindern und keine Ressourcen zu verschwenden.

Derzeit habe ich die Connection Timeout-Eigenschaft in IIS für die gesamte Site auf 60 Minuten festgelegt. Dann habe ich das in der web.config gemacht:

<system.web>
    <httpRuntime executionTimeout="480" maxRequestLength="1024" />
</system.web>

<location path="FileUpload/WriteFile.Rails">
    <system.web>
        <httpRuntime executionTimeout="3600" maxRequestLength="512000" />
    </system.web>
</location>

Ich hatte gehofft, dass dies alle URLs auf eine Zeitüberschreitung von 8 Minuten setzt und die WriteFile.Rails-URL 60 Minuten lang laufen lässt. Stattdessen dürfen ALLE URLs 60 Minuten lang ausgeführt werden. Wie kann ich IIS tun, was ich will?

16

Die Frage bezog sich speziell auf Zeitüberschreitungen, implizierte aber auch das Festlegen von maxRequestLength. Ich werde versuchen, eine wirklich umfassende Antwort auf beide Fragen zu geben (jetzt, da ich den größten Teil des Tages damit verbracht habe, mich damit zu beschäftigen).

Nehmen wir an, wir haben eine einzige URL auf unserer Website, die wir zum Hochladen von Dateien verwenden möchten. Wir möchten bis zu einem Gigabyte Daten in dieser URL aufnehmen und wir werden es unseren Kunden erlauben, für höchstens 1 Stunde eine Verbindung herzustellen. Für alle anderen URLs möchten wir nur 90 Sekunden Verbindungszeit und maximal 4 MB im Body POST zulassen.

Globale Einstellungen

Zuerst müssen Sie die Zeit- und Größenbeschränkungen für die gesamte Site global erhöhen. Zuerst möchten Sie das "Verbindungs-Timeout" für die gesamte Site festlegen. Dies ist eine absolute Obergrenze und kann nicht in der web.config festgelegt werden. Die IIS7-Website hat gute Anweisungen hier . Sie können dies auch programmgesteuert mit der in IIS7/7.5 enthaltenen Microsoft.Web.Administrationlibrary tun:

var serverManager = ServerManager.OpenRemote("\\web-server-name");
var site = serverManager.Sites["Your-Site-Name"];
site.Limits.ConnectionTimeout = new TimeSpan(1, 0, 0);

Als nächstes müssen Sie die maximale Größe festlegen, die die Site zulässt. Im Request Fitlering-Modul befindet sich dies an einer ganz anderen Stelle. Dieses Modul ist unter IIS7 möglicherweise nicht standardmäßig installiert. Wieder hat Microsoft gute Anweisungen , wie man die maxAllowedContentLength über die GUI einstellt. Dies können Sie in der Web.config einstellen:

<system.webServer>
    <security>
        <requestFiltering>
            <!-- Allow 1GB uploads -->
            <requestLimits maxAllowedContentLength="1073741824"></requestLimits>
        </requestFiltering>
    </security>
</system.webServer>

Diese Einstellung wird anhand des Headers Content-Length ausgewertet, und Anforderungen, die größer als dieser Wert sind, führen sofort zu einem 404.13. Die Einstellung erfolgt in Bytes und als Nächstes in Kilobytes, was in diesem IIS7 sehr konsistent ist.

ASP.NET-Einstellungen

Als Nächstes möchten wir alle ASP.NET-Anforderungen auf 90 Sekunden/4 MB begrenzen. Dies kann in der web.config gemacht werden:

<location>
    <system.web>
        <httpRuntime executionTimeout="90" maxRequestLength="4096" />
    </system.web>
</location>

Um die Einstellungen global zu machen, wird das Tag system.web in ein Tag location eingeschlossen, das kein Attribut path enthält. (In der ursprünglichen Frage habe ich das Tag "system.web" nicht in das Tag "location" gewickelt, das wahrscheinlich die Ursache meines Problems war.) maxRequestLength ist diesmal in Kilobytes.

Schließlich möchten wir zulassen, dass unsere spezielle Upload-URL große Uploads akzeptiert. Wenn Sie diese Werte höher als die global festgelegten Werte einstellen, funktioniert dies nicht. Die globalen Werte überschreiben diese Einstellungen.

<location path="Uploads/PostFile.Rails">
    <system.web>
        <httpRuntime executionTimeout="3600" maxRequestLength="1048576" />
    </system.web>
</location>

Wenn alles andere richtig eingestellt ist, sollte es das tun. Wie von Peter Bromberg vorgeschlagen, können Sie so viele dieser Blöcke wie erforderlich hinzufügen, um die Grenzwerte für bestimmte URLs zu erhöhen.

Eine letzte Anmerkung: Im Debug-Modus erzwingt IIS nicht die Einstellungen für Connection Timeout oder executionTimeout, damit Sie mehr Zeit für das Debuggen haben. Um Ihre Einstellungen auf einem Entwicklercomputer zu testen, sollten Sie einen Release-Build ausführen und die Einstellung "Serverseitiges Debuggen aktivieren" auf "false" setzen.

28

Sie können das ScriptTimeout jederzeit direkt in Ihrer Controller-Aktion festlegen. Auf diese Weise wird die Konfiguration nicht unterbrochen, wenn Sie Ihr Routing ändern.

0
jishi

Um das Zeitlimit für eine bestimmte Seite festzulegen, können Sie beliebig viele <location path web.config-Elemente verwenden:

<location path="Myfile.aspx">
  <system.web>
    <httpRuntime executionTimeout="180"/>
  </system.web>
</location>

Solange Ihr Pfad korrekt definiert ist und die Erweiterung .Rails ASP.NET zugeordnet ist, sollte dies funktionieren. Kann es sein, dass das ASP.NET-Ausführungsmodul keine * .Rails-Erweiterungen verarbeitet?

HINWEIS: Mann, was für ein mieser Post-Editor. Warum können Sie nicht die Flucht für den Benutzer tun?

0
Peter Bromberg