Frage

Ich schreibe eine Upload-Funktion und habe Probleme beim Abfangen von „System.Web.HttpException:„Maximale Anforderungslänge überschritten“ mit Dateien, die größer als die angegebene maximale Größe sind httpRuntimein web.config (maximale Größe auf 5120 eingestellt).Ich verwende ein einfaches <input> für die Datei.

Das Problem besteht darin, dass die Ausnahme vor dem Klickereignis der Upload-Schaltfläche ausgelöst wird und die Ausnahme auftritt, bevor mein Code ausgeführt wird.Wie kann ich die Ausnahme abfangen und behandeln?

BEARBEITEN: Die Ausnahme wird sofort ausgelöst, daher bin ich mir ziemlich sicher, dass es sich nicht um eine Zeitüberschreitung aufgrund langsamer Verbindungen handelt.

War es hilfreich?

Lösung

Es gibt keine einfache Möglichkeit, leider solche Ausnahme zu fangen. Was ich tue, ist entweder die OnError-Methode auf Seitenebene außer Kraft setzen oder die Application_Error in global.asax, dann prüfen, ob es sich um ein Max Antrag Ausfall und war, wenn ja, auf eine Fehlerseite übertragen.

protected override void OnError(EventArgs e) .....


private void Application_Error(object sender, EventArgs e)
{
    if (GlobalHelper.IsMaxRequestExceededException(this.Server.GetLastError()))
    {
        this.Server.ClearError();
        this.Server.Transfer("~/error/UploadTooLarge.aspx");
    }
}

Es ist ein Hack, aber der folgende Code funktioniert bei mir

const int TimedOutExceptionCode = -2147467259;
public static bool IsMaxRequestExceededException(Exception e)
{
    // unhandled errors = caught at global.ascx level
    // http exception = caught at page level

    Exception main;
    var unhandled = e as HttpUnhandledException;

    if (unhandled != null && unhandled.ErrorCode == TimedOutExceptionCode)
    {
        main = unhandled.InnerException;
    }
    else
    {
        main = e;
    }


    var http = main as HttpException;

    if (http != null && http.ErrorCode == TimedOutExceptionCode)
    {
        // hack: no real method of identifying if the error is max request exceeded as 
        // it is treated as a timeout exception
        if (http.StackTrace.Contains("GetEntireRawContent"))
        {
            // MAX REQUEST HAS BEEN EXCEEDED
            return true;
        }
    }

    return false;
}

Andere Tipps

Wie Gatekiller sagte Sie die maxRequestLength ändern müssen. Sie können auch die executionTimeout im Falle ändern müssen die Upload-Geschwindigkeit zu langsam ist. Beachten Sie, dass Sie nicht über eine dieser Einstellungen wollen zu groß sein, sonst werden Sie zu DoS-Attacken offen sein.

Die Standardeinstellung für die executionTimeout ist 360 Sekunden oder 6 Minuten.

Sie können die maxRequestLength und executionTimeout ändern sich mit der Httpruntime Element .

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <httpRuntime maxRequestLength="102400" executionTimeout="1200" />
    </system.web>
</configuration>

EDIT:

Wenn Sie die Ausnahme behandeln wollen, unabhängig dann wie bereits erwähnt, Sie werden es in Global.asax handhaben müssen. Hier ist ein Link zu einem

Sie können dieses Problem lösen, indem die maximale Anforderungslänge in Ihrem web.config erhöht:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <httpRuntime maxRequestLength="102400" />
    </system.web>
</configuration>

Das obige Beispiel ist für eine 100-MB-Grenze.

Hallo Lösung von Damien McGivern erwähnt, Funktioniert auf IIS6 nur,

Es funktioniert nicht auf IIS7 und ASP.NET Development Server. Ich erhalte Seite Anzeige „404 -. Datei oder das Verzeichnis nicht gefunden“

Irgendwelche Ideen?

EDIT:

Haben Sie es ... Diese Lösung noch nicht auf ASP.NET Development Server funktioniert, aber ich habe den Grund, warum es nicht in meinem Fall auf IIS7 arbeiten.

Der Grund ist IIS7 hat eine eingebaute anfordern Abtastung, die eine Datei-Upload Kappe auferlegt, die standardmäßig 30000000 Bytes (die etwas weniger als 30 MB).

Und ich habe versucht, Datei mit einer Größe von 100 MB zu laden, die Lösung von Damien McGivern (mit maxRequestLength = „10240“ heißen 10MB in web.config) erwähnt zu testen. Nun, wenn ich die Datei mit einer Größe> 10 MB hochladen und <30 MB dann wird die Seite an die angegebene Fehlerseite umgeleitet. Aber wenn die Dateigröße ist> 30MB dann zeigen sie die hässliche eingebaute Fehlerseite angezeigt wird „404 -. Datei oder das Verzeichnis nicht gefunden“

Also, dies zu vermeiden, müssen Sie den max erhöhen. Anforderungs-Inhalt-Länge für Ihre Website in IIS7 erlaubt. Das kann mit folgendem Befehl erfolgen,

appcmd set config "SiteName" -section:requestFiltering -requestLimits.maxAllowedContentLength:209715200 -commitpath:apphost

Ich habe den max. Inhaltslänge zu 200MB.

Nachdem Sie diese Einstellung zu tun, wird die Seite succssfully meine Fehlerseite umgeleitet, wenn ich versuche Datei von 100 MB hochladen

Siehe, http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx für weitere Details.

Wenn Sie eine Client-seitige Validierung wollen auch, so dass Sie weniger eine Notwendigkeit bekommen Ausnahmen werfen Sie könnten versuchen, Client-Seite Dateigröße Validierung zu implementieren.

Hinweis: Dies funktioniert nur in Browsern, die HTML5 unterstützen. http://www.html5rocks.com/en/tutorials/file/dndfiles/

<form id="FormID" action="post" name="FormID">
    <input id="target" name="target" class="target" type="file" />
</form>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>

<script type="text/javascript" language="javascript">

    $('.target').change(function () {

        if (typeof FileReader !== "undefined") {
            var size = document.getElementById('target').files[0].size;
            // check file size

            if (size > 100000) {

                $(this).val("");

            }
        }

    });

</script>

Hier ist eine alternative Art und Weise, die keine "Hacks" mit sich bringt, erfordert aber ASP.NET 4.0 oder höher:

//Global.asax
private void Application_Error(object sender, EventArgs e)
{
    var ex = Server.GetLastError();
    var httpException = ex as HttpException ?? ex.InnerException as HttpException;
    if(httpException == null) return;

    if(httpException.WebEventCode == WebEventCodes.RuntimeErrorPostTooLarge)
    {
        //handle the error
        Response.Write("Sorry, file is too big"); //show this message for instance
    }
}

Eine Möglichkeit, dies zu tun, ist die maximale Größe in web.config zu setzen, wie bereits weiter oben zum Beispiel festgestellt worden

<system.web>         
    <httpRuntime maxRequestLength="102400" />     
</system.web>

dann, wenn Sie den Upload-Ereignis behandeln, überprüfen Sie die Größe und wenn eine bestimmte Menge seiner über, können Sie es trap z.

protected void btnUploadImage_OnClick(object sender, EventArgs e)
{
    if (fil.FileBytes.Length > 51200)
    {
         TextBoxMsg.Text = "file size must be less than 50KB";
    }
}

Eine Lösung, die mit IIS7 arbeitet und nach oben: Anzeige benutzerdefinierte Fehlerseite, wenn Datei-Upload-Größe in ASP.NET MVC erlaubt überschreitet

In IIS 7 und darüber hinaus:

Datei web.config:

<system.webServer>
  <security >
    <requestFiltering>
      <requestLimits maxAllowedContentLength="[Size In Bytes]" />
    </requestFiltering>
  </security>
</system.webServer>

Sie können dann im Code überprüfen hinter, etwa so:

If FileUpload1.PostedFile.ContentLength > 2097152 Then ' (2097152 = 2 Mb)
  ' Exceeded the 2 Mb limit
  ' Do something
End If

So stellen Sie sicher, dass die [Größe in Bytes] in der web.config größer ist als die Größe der Datei, die Sie hochladen möchten, dann werden Sie den 404-Fehler nicht erhalten. Anschließend können Sie die Dateigröße im Code überprüfen Sie die ContentLength hinter mit denen viel besser wäre

Wie Sie wahrscheinlich wissen, ist die maximale Anforderungslänge in konfiguriert ZWEI setzt.

  1. maxRequestLength - gesteuert auf der ASP.NET-App-Ebene
  2. maxAllowedContentLength - unter <system.webServer>, gesteuert auf IIS-Ebene

Der erste Fall wird durch andere Antworten auf diese Frage abgedeckt.

Fangen DER ZWEITE Sie müssen dies in global.asax tun:

protected void Application_EndRequest(object sender, EventArgs e)
{
    //check for the "file is too big" exception if thrown at the IIS level
    if (Response.StatusCode == 404 && Response.SubStatusCode == 13)
    {
        Response.Write("Too big a file"); //just an example
        Response.End();
    }
}

Nach dem Tag

<security>
     <requestFiltering>
         <requestLimits maxAllowedContentLength="4500000" />
     </requestFiltering>
</security>

Fügen Sie den folgenden Tag

 <httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" subStatusCode="13" />
  <error statusCode="404" subStatusCode="13" prefixLanguageFilePath="" path="http://localhost/ErrorPage.aspx" responseMode="Redirect" />
</httpErrors>

Sie die URL auf die Fehlerseite hinzufügen ...

Sie können dieses Problem lösen, indem die maximale Anforderungslänge und Ausführungszeit aus in Ihrem web.config erhöht:

-Please Clarify die maximale Ausführungszeit aus Reibe dann 1200

<?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <httpRuntime maxRequestLength="102400" executionTimeout="1200" /> </system.web> </configuration>

Wie sei es fängt bei Endrequest-Ereignisse?

protected 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);
        }
    }

Es kann über überprüft werden:

        var httpException = ex as HttpException;
        if (httpException != null)
        {
            if (httpException.WebEventCode == System.Web.Management.WebEventCodes.RuntimeErrorPostTooLarge)
            {
                // Request too large

                return;

            }
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top