asp.net

asp.net - ¿Cómo resuelvo la excepción "longitud de solicitud máxima excedida"?



(3)

Agregue lo siguiente a su archivo web.config:

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

Esto lo establece en 2GB. No estoy seguro de cuál es el máximo.

Cuando subí una imagen tuve este error:

longitud máxima de solicitud superada

¿Como puedo solucionar este problema?


No es una forma excelente de hacerlo, ya que básicamente estás abriendo tu servidor a los ataques DoS, lo que permite a los usuarios enviar archivos inmensos. Si sabe que el usuario solo debe cargar imágenes de un tamaño determinado, debe hacerlo cumplir en lugar de abrir el servidor a envíos aún más grandes.

Para ello puedes utilizar el siguiente ejemplo.

Como me lamentaron por publicar un enlace, agregué lo que finalmente implementé utilizando lo que aprendí del enlace que publiqué anteriormente, y esto se probó y funciona en mi propio sitio ... asume un límite predeterminado de 4 MB. Puede implementar algo como esto o, alternativamente, emplear algún tipo de control ActiveX terceros.

Tenga en cuenta que, en este caso, redirijo al usuario a la página de error si su envío es demasiado grande, pero no hay nada que le impida seguir personalizando esta lógica si así lo desea.

Espero que sea útil.

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


Puede aumentar la longitud máxima de las solicitudes en web.config, en <system.web> :

<httpRuntime maxRequestLength="100000" />

Este ejemplo establece el tamaño máximo en 100 MB.