2010-09-08 18 views
20

Wenn ich ein Bild hochladen ich diesen Fehler hatte:Wie behebe ich die Ausnahme "maximale Anforderungslänge überschritten"?

maximum request length exceeded

Wie kann ich dieses Problem beheben?

+1

Mögliche Duplikat [Maximale Anforderungslänge überschritten] (http://stackoverflow.com/questions/3853767/maximum-request-length-exceeded) – niico

+0

Wie Niico sagte zum Beispiel, wenn Sie verwenden mehr als eine Zeile in Web.config, können Sie diesen Fehler erhalten. – oguzhan

Antwort

41

folgendes Datei web.config hinzufügen:

<configuration> 
    <system.web> 
     <httpRuntime maxRequestLength ="2097151"/> 
    </system.web> 
</configuration> 

Dieses es zu 2GB setzt. Nicht sicher, was das Maximum ist.

+3

Stellen Sie sicher, dass Sie dies zum Haupt 'Web.config' hinzufügen, anstelle des im Ordner' Views' ... –

+3

ja, aber wie diese Ausnahme zu fangen? Einstellung von maxRequestLength auf 2 GB Ich denke, ist nicht das beste Wählen .... – MDDDC

+0

rettete meinen Tag! Danke, Mann! – Flappy

20

Sie können die maximale Länge von Anfragen in web.config unter <system.web> erhöhen:

<httpRuntime maxRequestLength="100000" /> 

In diesem Beispiel wird die maximale Größe auf 100   MB.

7

Das ist keine großartige Möglichkeit, es zu tun, da Sie im Grunde Ihren Server zu DoS attacks öffnen, so dass Benutzer immense Dateien einreichen können. Wenn Sie wissen, dass der Benutzer nur Bilder einer bestimmten Größe hochladen soll, sollten Sie dies erzwingen, anstatt den Server für noch größere Übermittlungen zu öffnen.

Um dies zu tun, können Sie das Beispiel unten verwenden.

Da ich für den Posten eines Links gestöhnt wurde, habe ich hinzugefügt, was ich letztlich implementiert, mit dem, was ich von dem Link gelernt habe ich zuvor gepostet - und dies wurde getestet und funktioniert auf meiner eigenen Website ... es geht davon aus ein Standardlimit von 4   MB. Sie können entweder so etwas implementieren oder alternativ eine Art von ActiveX Steuerelement von Drittanbietern verwenden.

Beachten Sie, dass ich in diesem Fall den Benutzer auf die Fehlerseite umleiten, wenn ihre Einreichung zu groß ist, aber nichts hält Sie davon ab, diese Logik weiter anzupassen, wenn Sie dies wünschen.

Ich hoffe, es ist nützlich.

public class Global : System.Web.HttpApplication { 
    private static long maxRequestLength = 0; 

    /// <summary> 
    /// Returns the max size of a request, in kB 
    /// </summary> 
    /// <returns></returns> 
    private long getMaxRequestLength() { 

     long requestLength = 4096; // Assume default value 
     HttpRuntimeSection runTime = ConfigurationManager.GetSection("system.web/httpRuntime") as HttpRuntimeSection; // check web.config 
     if(runTime != null) { 
      requestLength = runTime.MaxRequestLength; 
     } 
     else { 
      // Not found...check machine.config 
      Configuration cfg = ConfigurationManager.OpenMachineConfiguration(); 
      ConfigurationSection cs = cfg.SectionGroups["system.web"].Sections["httpRuntime"]; 
      if(cs != null) { 
       requestLength = Convert.ToInt64(cs.ElementInformation.Properties["maxRequestLength"].Value); 
      } 
     } 
     return requestLength; 
    } 

    protected void Application_Start(object sender, EventArgs e) { 
     maxRequestLength = getMaxRequestLength(); 
    } 

    protected void Application_End(object sender, EventArgs e) { 

    } 

    protected void Application_Error(object sender, EventArgs e) { 
     Server.Transfer("~/ApplicationError.aspx"); 
    } 

    public override void Init() { 
     this.BeginRequest += new EventHandler(Global_BeginRequest); 
     base.Init(); 
    } 

    protected void Global_BeginRequest(object sender, EventArgs e) { 

     long requestLength = HttpContext.Current.Request.ContentLength/1024; // Returns the request length in bytes, then converted to kB 

     if(requestLength > maxRequestLength) { 
      IServiceProvider provider = (IServiceProvider)HttpContext.Current; 
      HttpWorkerRequest workerRequest = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest)); 

      // Check if body contains data 
      if(workerRequest.HasEntityBody()) { 

       // Get the total body length 
       int bodyLength = workerRequest.GetTotalEntityBodyLength(); 

       // Get the initial bytes loaded 
       int initialBytes = 0; 
       if(workerRequest.GetPreloadedEntityBody() != null) { 
        initialBytes = workerRequest.GetPreloadedEntityBody().Length; 
       } 
       if(!workerRequest.IsEntireEntityBodyIsPreloaded()) { 
        byte[] buffer = new byte[512000]; 

        // Set the received bytes to initial bytes before start reading 
        int receivedBytes = initialBytes; 
        while(bodyLength - receivedBytes >= initialBytes) { 

         // Read another set of bytes 
         initialBytes = workerRequest.ReadEntityBody(buffer, buffer.Length); 

         // Update the received bytes 
         receivedBytes += initialBytes; 
        } 
        initialBytes = workerRequest.ReadEntityBody(buffer, bodyLength - receivedBytes); 
       } 
      } 

      try { 
       throw new HttpException("Request too large"); 
      } 
      catch { 
      } 

      // Redirect the user 
      Server.Transfer("~/ApplicationError.aspx", false); 
     } 
    } 
Verwandte Themen