2010-09-08 16 views
20

Kiedy przesłać obraz miałem ten błąd:Jak rozwiązać wyjątek "Maksymalna długość przekroczenia żądania"?

maximum request length exceeded

Jak mogę rozwiązać ten problem?

+1

Możliwy duplikat [Maksymalna długość żądanie przekroczone] (http://stackoverflow.com/questions/3853767/maximum-request-length-exceeded) – niico

+0

Jak niico powiedział, na przykład, jeśli używasz więcej niż jedna linia w Web.config, możesz dostać ten błąd. – oguzhan

Odpowiedz

41

Dodaj poniższe linie do pliku web.config:

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

To ustawia go do 2GB. Nie wiem, co to jest max.

+3

Upewnij się, że dodajesz to do głównego 'Web.config' zamiast tego w folderze' Widoki' ... –

+3

tak, ale jak złapać ten wyjątek? Ustawienie maxRequestLength na 2 GB Myślę, że nie jest najlepsze choise .... – MDDDC

+0

Uratowałem mój dzień! Dzięki! – Flappy

20

Można zwiększyć maksymalną długość wniosków w web.config, pod <system.web>:

<httpRuntime maxRequestLength="100000" /> 

Ten przykład ustawia maksymalny rozmiar 100   MB.

7

To nie jest świetny sposób, aby to zrobić, ponieważ w zasadzie otwierasz swój serwer na DoS attacks, umożliwiając użytkownikom przesyłanie ogromnych plików. Jeśli wiesz, że użytkownik powinien przesyłać tylko obrazy o określonej wielkości, powinieneś je egzekwować, zamiast otwierać serwer na jeszcze większe przesyłki.

Aby to zrobić, możesz skorzystać z poniższego przykładu.

Gdy zostałem narzekający za opublikowanie linku, dodałem, co ostatecznie zaimplementowałem, korzystając z tego, czego dowiedziałem się z linku, który wcześniej opublikowałem - i zostało to przetestowane i działa na mojej własnej stronie ... zakłada domyślny limit 4   MB. Możesz albo zaimplementować coś podobnego, albo alternatywnie użyć jakiegoś elementu kontrolnego innej firmy.

Należy zauważyć, że w tym przypadku przekierowuję użytkownika na stronę błędu, jeśli jego przesłanie jest zbyt duże, ale nic nie powstrzyma cię przed dostosowaniem tej logiki w razie potrzeby.

Mam nadzieję, że przyda się.

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); 
     } 
    } 
Powiązane problemy