V tomto krátkém článku bych vám rád ukázal, jak omezit maximální velikost HTTP požadavku v prostředí ASP.NET. Dozvíte se, jak maximální velikost nastavit a jak zabránit pádu aplikace, který nastane při jejím překročení.
Téměř každý z vás už někdy potřeboval na server odeslat nějaký soubor a následně ho uložit do složky/databáze (tím se zabývat nebudu). Data všech odesílaných souborů jsou součástí HTTP requestu a tak se může snadno stát, že dojde k překročení jeho maximální velikosti.
Mým dnešním úkolem je říct vám, jak takovou maximální velikost nastavit a jak zabránit pádu aplikace v případě jejího překročení.
Změna maximální velikosti
Konfigurace probíhá samozřejmě v souboru web.config a tentokrát stačí přidat jeden řádek kódu do sekce
<httpRuntime maxRequestLength="6144" />
Hodnotu attributu maxRequestLength je nutné zadávat v kilobytech. Defaultní hodnota je 4096 kB.
Ověření velikosti požadavku
Nejlepším místem pro ověření velikosti požadavku je podle mě soubor global.asax, který vytváří třídu odvozenou od třídy HttpApplication a může tak reagovat na různé aplikační události.
V první řadě je dobré ze souboru web.config získat maximální velikost požadavku, to lze provést při inicializaci aplikace. Proměnná maxRequestLength je definována ve stejné třídě a ve výchozím stavu je její hodnota 4096.
/// <summary>
/// Při inicializaci aplikace zjistí, jaká je maximální velikost HTTP požadavku.
/// </summary>
public override void Init()
{
// získá sekci <httpRuntime>
HttpRuntimeSection section = ConfigurationManager.GetSection("system.web/httpRuntime") as HttpRuntimeSection;
// předá hodnotu attributu maxRequestLength
if (section != null)
{
this.maxRequestLength = section.MaxRequestLength;
}
// inicializuje aplikaci
base.Init();
}
Následně musíte porovnat maximální velikost s velikostí právě probíhajícího požadavku, a to nejlépe hned na jeho začátku. Pokud to neuděláte, může dojít k pádu aplikace.
/// <summary>
/// Pokud velikost požadavku přesáhne maximální velikost, přesměruje na stránku s chybou.
/// </summary>
private void Application_BeginRequest(object sender, EventArgs e)
{
// pokud jde o stránku s uploadem
if (this.Request.Path.ToLower().Contains("default.aspx"))
{
// získá aktuální velikost požadavku
long requestLength = this.Request.ContentLength;
// pokud přesahuje maximální velikost požadavku
if ((requestLength / 1024) > maxRequestLength)
{
// přesměruje na stránku s chybou
this.Response.Redirect(string.Format("{0}?action=error&size={1}", this.Request.Path, this.maxRequestLength));
}
}
}
Věřím, že jsem vás přivedl na správnou cestu a že už zbytek zvládnete sami. Pokud s tím budete mít problémy, můžete si stáhnout zdrojové kódy celé aplikace (kompilace vyžaduje Web Application Project).