Static file Handler - servírujeme návštěvníkům soubory

Konečně je na čase, abych tady zmínil také něco o .NETu, o kterém by tento log měl být především. Mám v hlavě pár témat, která tu chci uveřejnit, jedním z nich je něco o tom, co může pomoci v každodenní rutině. A také o tom, jak vlastně vznikal tento systém, který publikuje moje výplody.

Static file HttpHandler

Vesměs v každé aplikaci, kterou píši je potřeba poslat na klienta nějaký statický soubor. Za příklad se dá vzít obrázek. Jenže tenhle obrázek se musí použít na více stránkách a navíc ještě v různých "zanořeních" v adresářové struktuře webu. To byl můj problém i tady, nabídnout soubory kdekoli ve struktuře webu a to pomocí jednoduchého odkazu, i když zrovna nevím odkud se ten soubor bude volat.

A právě k tomu jsem využil možností, které nabízí .NET.

Dobrá, teď někdo může namítnout, že o HttpHandlerech toho bylo napsáno i v českých končínách dost. Jsou to hlavně články Reného Steina [Vytvoření nového http handleru v ASP.NET] nebo Michala Altair Valáška [ Pohled do hlubin webserverovy duše (aneb jak fungují HTTP moduly a handlery)] a další se určitě ještě najdou.

Mě jde ale o to, předvést jak jsem implementoval posílání souborů, obrázků a dalších statických souborů na klienta. A to právě pomocí implementace rozhraní IHttpHandler.

Jak to celé funguje

Nejdříve bylo nutné napsat v handleru obsluhu metody ProcessRequest a namapovat tento handler ve web.configu. Což sice byla až konečná úprava, ale uvedu ji na prvním místě.

Registrace je provedena na soubor resfile.aspx (nic ale nebrání tomu, abyste si zvolili vlastní název souboru) v sekci httpHandlers takto: . Tento řádek zabezpečí, že veškeré odkazy směřující na soubor resfile.aspx budou zpracovány právě tímto handlerem.

Teď nastává druhá část řešení, napsání metody, která bude poskytovat soubory. Z důvodu větší univerzálnosti řešení jsem zvolil následující podmínky. Soubory, které budu takto publikovat se můžou nacházet kdekoli v adresářích na webu. Druhou podmínkou je, že některé soubory se budou stahovat přímo do prohlížeče, některé by se měli nabídnout návštěvníkovi ke stažení pod daným názvem souboru. Pro uchování potřebných informací jsem zvolil xml soubor, který bude obsahovat následující informace:

  • Klíč, který bude vytažen z QueryStringu a je jednoznačný pro každý poskytovaný soubor
  • Umístění souboru v adresářové struktuře od rootu webové aplikace
  • Informaci, zda do hlavičky bude zaslána informace o názvu souboru, pod kterým si uživatel může soubor uložit.
Takto jsem získal tabulku s informacemi. Byla to tabulka, takže pro načtení souboru jsem použil DataSet a ten jsem vložil do aplikační Cache pro rychlejší přístup. S tím, že je vázán na změnu daného xml souboru. Ještě je potřeba se zmínit o daném xml souboru. Protože pokud náhodou někdo odhadne název zdrojového souboru, získal by přístup k informacím v něm uloženým. Což ne vždy musí být chtěné. Takže přípona tohoto souboru je .config, což je opět mapovaná přípona na HttpHandler, konkrétně na System.Web.HttpForbiddenHandler.

Mám připravenu tabulku, ze které budu čerpat data. Teď už jen zbývá načíst soubor a odeslat jej s potřebnými informacemi na klientský počítač.

Pravda, ještě jedna nutnost tu je, zjistit content type odesílaného souboru. Ten si neukládám do tabulky, ale zjišťuji přímo pomocí koncovky souboru, při neexistenci (neznámé koncovce) pak odesílám content type application/octet-stream.

To bylo vše. Mám vše potřebné, takže zkompilovat a šup s tím do /bin adresáře na webu. Použití uvedeného handleru můžete vidět přímo na této stránce, kdy si soubor můžete pomocí uvedeného handleru stáhnout.

Snad vám představený StaticFileHandler pomůže stejně, jako pomáhá mě.

Add a Comment