Se vi siete imbattuti in questo articolo è probabile che stiate cercando di configurare la vostra applicazione ASP.NET (Core, MVC, Web API, Windows Forms, WCF o altro) su un web server IIS il quale, a differenza del web server di sviluppo, si rifiuta di accettare l'upload di un file di dimensioni superiori a 16kb, restituendo uno dei seguenti errori:
HTTP Error 413.1 - Request Entity Too Large
(413) Request Entity Too Large
Entità richiesta troppo grande
Maximum request length exceeded
Superata la lunghezza massima della richiesta
Tutti questi errori sono relativi al superamento delle dimensioni massime di un allegato - o meglio, della Request HTTP inviata al server - previste dalla nostra applicazione ASP.NET per impostazione predefinita. Queste limitazioni sono state inserite per una valida ragione: la ricezione di un file è una operazione piuttosto pesante per il server, in quanto impegna a tempo indeterminato un working thread. Per questo motivo, le impostazioni predefinite della maggior parte delle applicazioni ASP.NET prevedono una dimensione generalmente compresa tra i 16k e i 64k, sufficiente per l'invio/ricezione di form di testo ma logicamente del tutto inadeguate quando si ha l'esigenza di gestire l'upload di uno o più file.
Fortunatamente risolvere il problema è molto semplice: tutto quello che dobbiamo fare è modificare alcune sezioni presenti nel file Web.Config dell'applicazione per ampliare i limiti in bytes normalmente previsti per questo tipo di operazione. Poiché queste impostazioni variano a seconda delle versioni di IIS, abbiamo inserito tutte le versioni per le quali è necessario aggiungere (o modificare) i valori indicati.
MaxRequestLength
Questo valore imposta il limite massimo di lunghezza di ciascuna Request a un massimo di 1073741824 bytes.
Per tutte le versioni di IIS
1 2 3 4 5 |
<configuration> <system.web> <httpRuntime maxRequestLength="1048576" /> </system.web> </configuration> |
Per IIS 7 o versioni superiori
In aggiunta al precedente:
1 2 3 4 5 6 7 |
<system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="1073741824" /> </requestFiltering> </security> </system.webServer> |
HttpBindings
Se la vostra applicazione è un web service realizzato con ASP.NET WFC (SOAP) o Web API/MVC (REST), è inoltre necessario aggiungere i seguenti attributi ai binding che intendete utilizzare. Il modo migliore di procedere è aprire il Web.Config relativo all'applicazione e, in corrispondenza di ciascuno di essi, aggiungere i seguenti parametri evidenziati:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<system.serviceModel> <bindings> <basicHttpBinding> <binding maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" > <!-- binding config: security, httpTransport and more --> </binding> </basicHttpBinding> </bindings> </system.serviceModel> |
L'esempio di cui sopra ha lo scopo di incrementare la dimensione massima di un qualsiasi upload fino a 2147483647 bytes per tutte le connessioni di tipo basicHttpBinding: a seconda delle caratteristiche del vostro web service e dei protocolli utilizzati potrebbe essere necessario aggiungere gli attributi sopra indicati anche agli altri binding presenti, previsti e/o supportati: webHttpBinding, wsHttpBinding, customBinding e così via.
Nel caso in cui questa aggiunta non fosse sufficiente a risolvere il problema, potrebbe essere necessario modificare anche l'attributo transferMode, impostandolo a Streamed (l'impostazione predefinita è Buffered), e rivedere al rialzo anche le impostazioni relative alle readerQuotas, ovvero le limitazioni che il server impone ai client SOAP che effettuano la connessione:
1 2 3 4 5 6 7 8 9 10 11 |
<binding maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed"> <readerQuotas maxDepth="2000000" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> |
uploadReadAheadSize
Nel caso in cui tutte le operazioni descritte in precedenza non fossero sufficienti a risolvere il problema, non resta che provare a intervenire modificando il valore della proprietà uploadReadAheadSize: sfortunatamente, questa impostazione non può essere modificata a livello di web.config ma va definita direttamente sulla macchina che ospita il Web Server IIS di pubblicazione.
La necessità di modificare questa impostazione è particolarmente frequente quando si lavora con Windows Communication Foundation (WFC), il "moderno" metodo di gestione dei Web Service SOAP di cui abbiamo avuto già occasione di parlare in questo articolo, dove il problema generalmente si verifica in conseguenza di qualsiasi upload avente dimensioni superiori a 42-49kb.
Collegatevi dunque con Remote Desktop al PC in questione, quindi aprite un Prompt dei Comandi con privilegi di amministratore e digitate il seguente comando, avendo cura di sostituire a YOUR_WEBSITE_NAME il nome del sito web così come lo avete definito su IIS Manager al momento della creazione:
1 2 3 |
C:\Windows\System32\inetsrv\appcmd set config "YOUR_WEBSITE_NAME" -section:system.webServer/serverRuntime /uploadReadAheadSize:"2147483647" /commit:apphost |
Nel caso in cui vogliate operare in modo più generale, potete cambiare l'impostazione predefinita per tutti i siti web con il seguente comando PowerShell:
1 |
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webserver/serverruntime" -name "uploadreadaheadsize" -value 1048576 |
Se preferite utilizzare la GUI, potete configurare queste impostazioni anche tramite il pannello Editor di Configurazione (Configuration Editor) all'interno dello strumento Gestione Internet Information Services (IISManager):
Una volta lì, selezionate la sezione system.webServer/serverRuntime nella casella a sinistra, quindi modificate il valore dell'attributo uploadReadAheadSize di conseguenza:
IMPORTANTE: Assicuratevi che l'attributo enabled sia correttamente impostato a True, altrimenti l'intera sezione non sarà presa in considerazione e IIS utilizzerà le limitazioni predefinite, bloccando gli upload con dimensioni superiori a 42-49kb.
Per il momento è tutto: felice upload!