webentwicklung-frage-antwort-db.com.de

ASP.net HTTP 404 - Datei anstelle der MaxRequestLength-Ausnahme nicht gefunden

Ich habe eine Datei-Upload-Kontrolle auf meiner Webseite. Die maximale Anforderungslänge ist auf 8 MB (maxRequestLength = 8192) festgelegt. Ich habe auch eine Server-Validierung, die einen Fehler auslöst, wenn die Datei mehr als 4 MB beträgt. Der Grund dafür, dass seine 8 MB in der Konfiguration der Hebel ist, der dem Benutzer gegeben wird, und auch, damit die Anwendung getestet werden kann.

Wenn ich eine Datei hochlade, die 9 MB groß ist, wurde eine Ausnahme Maximale Anforderungslänge überschritten., was gut ist und wie erwartet funktioniert. Wenn ich jedoch versuche, eine Datei hochzuladen, die 1 GB groß ist, wird eine HTTP 404-Datei nicht gefunden angezeigt. Kann jemand bitte erklären, warum das so ist und wie kann ich eine maxRequestLength-Ausnahme auslösen?

Ich verwende IIS6.

38
Divi

Ich habe diesen Zustand heute erlebt (HTTP 404 beim Hochladen von Dateien mit IIS 7), aber ich dachte, ich hätte alle korrekten Konfigurationseinstellungen vorgenommen. Ich wollte Dateien mit einer Größe von bis zu 300 MB hochladen. Daher habe ich die folgenden web.config-Einstellungen in einem Unterordner der Anwendung vorgenommen:

<configuration>
    <system.web>
        <httpRuntime maxRequestLength="307200" />
    </system.web>
    <system.webServer>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="314572800" />
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>

Diese Konfiguration funktionierte im Test, aber als ich die aktualisierten Dateien einschließlich der Datei web.config auf den Produktionsserver kopierte, erhielt ich den Fehler HTTP 404 beim Hochladen einer 90-MB-Datei. Kleinere Dateien unter dem anwendungsweiten Limit von 30 MB funktionierten einwandfrei, daher wusste ich, dass es sich um ein Problem mit der Anfragegröße handelte.

Ich nahm an, dass es eine Chance gab, dass IIS einige Anwendungseinstellungen zwischengespeichert hatte und sie einfach nicht aktualisiert hatte. Also habe ich den Anwendungspool wiederverwendet, danach lief alles wie erwartet.

58
pseudocoder

Dies ist ein bisschen ein alter Thread, aber ich dachte, ich sollte meine Erfahrungen damit hinzufügen.

Das gleiche Problem hatte ich mit großen Datei-Uploads und der Web-API. Ein 404.13 wird geworfen, bevor er überhaupt an einen Controller gelangt, also musste ich herausfinden, wo ich hineingehen und diesen Fall bearbeiten sollte.

Meine Lösung waren die folgenden web.config-Einträge:

Ich verwende die 404.13, indem ich sie auf einen MVC-Controller umleitete (es könnte eine Webforms-Seite sein), und normale 404-Fehler trafen meine 404-Route. Es ist wichtig, dass der ResponseMode = "Weiterleitung" für 404.13 ist

<httpErrors errorMode="Custom">
  <remove statusCode="404" subStatusCode="-1" />            
  <error statusCode="404" subStatusCode="13" path="/errors/filesize" responseMode="Redirect" />
  <error statusCode="404" path="/errors/notfound" responseMode="ExecuteURL" />      
</httpErrors>

Dann habe ich in meinem Fehler-Controller Folgendes:

public ActionResult FileSize()
{
    Response.StatusCode = 500;
    Response.StatusDescription = "Maximum file size exceeded.";
    Response.End();
    return null;
}

Auch hier könnte es sich um eine reguläre Webformularseite handeln.

8
ScottE

Ich fühle, dass keine der Antworten hier erklärt warum Sie eine 404 bekommen, sie sagen Ihnen nur die üblichen Dinge, wie Sie das Problem beheben können.

Das 404 ist nicht auf eine falsche Konfiguration zurückzuführen, es ist beabsichtigtes und dokumentiertes Verhalten :

Wenn die Anforderungsfilterung eine HTTP-Anforderung blockiert, weil eine HTTP-Anforderung die Anforderungsgrenzwerte überschreitet, gibt IIS 7 einen HTTP 404-Fehler an den Client zurück und protokolliert einen der folgenden HTTP-Status mit einem eindeutigen Unterstatus, der den Grund für die Anforderung angibt wurde abgelehnt:

 HTTP-Substatus Beschreibung 

 404.13 Inhaltslänge zu groß 
 404.14 URL zu lang 
 404.15 Abfragezeichenfolge zu lang 

Mithilfe dieser Unterprogramme können Webadministratoren ihre IIS - Protokolle analysieren und potenzielle Bedrohungen identifizieren.

Wenn eine HTTP-Anforderung die im Element <headerLimits> definierten Header-Grenzwerte überschreitet, gibt IIS 7 einen HTTP 404-Fehler mit dem folgenden Unterstatus an den Client zurück:

 HTTP Substatus Beschreibung 

 404.10 Anforderungskopf zu lang 
8
Stijn

Ich habe festgestellt, dass dieses Problem auch auf IIS7 (und vermutlich IIS6) verursacht werden kann, wenn das URLScan-Tool installiert ist und auf der Website ausgeführt wird.

Beim Hochladen der Datei auf eine Website erhielt ich die Meldung "Datei oder Verzeichnis nicht gefunden. Die von Ihnen gesuchte Ressource wurde möglicherweise entfernt, der Name wurde geändert oder ist vorübergehend nicht verfügbar."

Wenn das Problem durch URLScan verursacht wird und Sie beim Durchsuchen der Website auf dem Hosting-Server selbst versuchen, die große Datei auf die Website hochzuladen, wird eine vollständige asp.net-Fehlernachricht anstelle von 404 mit URLScan angezeigt Sie können auch überprüfen, ob URLScan auf Ihrer Website in IIS7 ausgeführt wird, indem Sie die ISAPI-Filter für die Website in IIS anzeigen. URLScan wird aufgelistet, wenn sie verwendet wird.

Dies kann behoben werden, indem die ini-Datei für URLScan unter "% WINDIR%\System32\Inetsrv\URLscan" geändert wird und die MaxAllowedContentLength geändert wird. Die MaxAllowedContentLength ist in Byte angegeben.

Dies kann einen Neustart von IIS erfordern, der jedoch wirksam wurde, wenn ich es selbst mit IIS7 ausprobierte.

http://www.iis.net/learn/extensions/working-with-urlscan/urlscan-overview

http://www.iis.net/learn/extensions/working-with-urlscan/common-urlscan-scenarios

1
wsys177

Meines Wissens gibt es keine Möglichkeit, mit der Überschreitung der Einstellung "maxRequestLength" von IIS elegant umzugehen. Es kann nicht einmal eine benutzerdefinierte Fehlerseite angezeigt werden (da kein entsprechender HTTP-Code zum Antworten vorhanden ist). Der einzige Weg, dies zu umgehen, besteht darin, maxRequestLength auf eine absurd hohe Anzahl von Kilobytes (beispielsweise 51200 (50 MB)) einzustellen und dann die ContentLength zu überprüfen, nachdem die Datei hochgeladen wurde (vorausgesetzt, die Anforderung hat nicht vor 90 Sekunden einen Timeout überschritten). An diesem Punkt kann ich überprüfen, ob die Datei <= 5 MB ist, und einen befreundeten Fehler anzeigen.

Sie können auch diesen Link versuchen.

Sie könnten auch so etwas versuchen:

private void application_EndRequest(object sender, EventArgs e)
{
    HttpRequest request = HttpContext.Current.Request;
    HttpResponse response = HttpContext.Current.Response;

    if ((request.HttpMethod == "POST") &&
        (response.StatusCode == 404 && response.SubStatusCode == 13))
    {
        // Clear the response header but do not clear errors and transfer back to requesting page to handle error
        response.ClearHeaders();
        HttpContext.Current.Server.Transfer(request.AppRelativeCurrentExecutionFilePath);
    }
}
1
Scott

Sie können die Standardfehlerseite in IIS selbst konfigurieren.

0
user584539

Das Anforderungslimit ist eine Einstellung ist IIS. Öffnen Sie den Abschnitt Anforderungsfilterung Ihrer Site in IIS und wählen Sie Anforderungseinstellungen bearbeiten. Für mich war das so einfach.

Eine detailliertere Anleitung von Microsoft.

https://docs.Microsoft.com/en-us/iis/configuration/system.webserver/security/requestfiltering/#how-to-edit-the-request-filtering-feature-settings-and-request-limits

0
DarrenY