Comment puis-je résoudre l'exception relative à la "longueur maximale de la demande dépassée"?

Quand j'upload une image que j'ai eu cette erreur:

longueur maximale de la requête dépassée

Comment puis-je résoudre ce problème?

24
demandé sur Peter Mortensen 2010-09-08 17:23:18

3 réponses

ajouter ce qui suit à votre site web.fichier de configuration:

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

cela le met à 2 Go. Pas certain de ce que le max est.

50
répondu kd7 2017-11-29 07:24:50

vous pouvez augmenter la durée maximale des requêtes sur le web.config, en vertu de l' <system.web>:

<httpRuntime maxRequestLength="100000" />

cet exemple fixe la taille maximale à 100 Mo.

21
répondu Philippe Leybaert 2017-06-05 09:34:41

ce n'est pas une façon formidable de le faire car vous ouvrez votre serveur à les attaques de DoS permettant aux utilisateurs de soumettre immense fichiers. Si vous savez que l'utilisateur ne devrait Télécharger que des images d'une certaine taille, vous devriez appliquer cela plutôt que d'ouvrir le serveur à des soumissions encore plus grandes.

Pour ce faire vous pouvez utiliser l'exemple ci-dessous.

comme j'ai été réprimandé pour avoir posté un lien, j'ai ajouté ce que j'ai finalement implémenté en utilisant ce que J'ai appris du lien que j'ai posté précédemment - et cela a été testé et fonctionne sur mon propre site...il suppose une limite par défaut de 4 Mo. Vous pouvez soit mettre en œuvre quelque chose comme cela, ou bien employer une sorte de tiers ActiveX de contrôle.

notez que dans ce cas, je redirige l'utilisateur vers la page d'erreur si sa soumission est trop importante, mais rien ne vous empêche de personnaliser davantage cette logique si vous le souhaitez.

j'espère que c'est utile.

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);
        }
    }
8
répondu burgen 2017-06-05 09:41:16