Http handler v ASP.NET je autonomní funkční modul pro zpracovaní požadavků, jež jsou cíleny na soubory se specifickou příponou či jménem. Pokud jste někdy programovali ISAPI extenze, tak http handler si můžete představit jako jejich zjednodušeného a odlehčeného příbuzného, s nímž můžete využít všech výhod .NET prostředí.

Http handlery můžete například použít pro dynamické generování obrázků. Dalším příkladem použití může být situace, kdy na klienta posíláte obsah xml souboru a chcete dát uživateli na výběr, v jakém formátu data dostane. Uživatel si může vybrat, že chce poslat „čistá“ xml data, ale také může požadovat data ve formátu html. To znamená, že před odesláním je na xml data aplikována XSL transformace. Důležité je, že požadavek vždy směřuje na stejný xml soubor, ale protože je na příponu xml namapován http handler, který si z kolekce Request.QueryString přečte informaci o požadovaném formátu a případně provede XSL transformaci, tak klient může dostat odpověď ve formátu html nebo xml.

Vytvoření http handleru

Každý http handler musí implementovat rozhraní IHttpHandler z jmenného prostoru System.Web.

interface IHttpHandler
{
  bool IsReusable
  {
    get;
  }
  void ProcessRequest(HttpContext context);
}

Vlastnost IsReusable ASP.NET runtime používá ke zjištění, zda je možné použít jednu instanci http handleru pro vyřízení více požadavků. Pokud musí být každý požadavek vyřízen novou instancí http handleru, tak vrátíme hodnotu false. Když je možné jednou instancí vyřídit více požadavků, tak vrátíme hodnotu true. Handlerům, které lze opakovaně používat, byste měli z výkonnostních důvodů dávat přednost.

Metoda ProcessRequest je odpovědná za vyřízení požadavku a vrácení odpovědi. Argumentem metody je instance třídy HttpContext, jež nese informace relevantní pro vyřízení požadavku. Zvláště důležité jsou její vlastnosti Request a Response.

Argument context ve výchozím nastavení nenese informace o “session“ uživatele. V případě, že se “session“ potřebujeme pracovat, musí http handler “implementovat“ rozhraní IReadOnlySessionState nebo IRequiresSessionState. Slovo implementovat je dáno do uvozovek, protože v obou případech jde o rozhraní, která nemají žádné členy a podle kterých ASP.NET runtime rozpozná, že handleru má poskytnout „session“ informace. Jak název rozhraní napovídá, rozhraní IReadOnlySessionState použijeme, když chceme hodnoty v „session“ pouze číst. Po označení http modulu rozhraním IRequiresSessionState můžeme hodnoty v „session“ číst, upravovat, mazat a přidávat.

Registrace http handleru

Vytvořený handler musíme zaregistrovat, aby ASP.NET runtime věděl, pro jaké přípony a jména souborů chceme handler používat. Když je vznesen požadavek na soubor s daným jménem a příponou, tak se o obsloužení požadavku postará příslušný http handler. Registraci handleru pro jednu aplikaci provedeme v souboru web.config v sekci system.web/httpHandlers. Registraci handleru pro všechny aplikace je možné provést ve stejné sekci v souboru machine.config.

<system.web>

  <httpHandlers>
  <add verb=“*“
   path=“*.newext “
   type=“NewHandlerNamespace.NewHandler, NewHandlerAssembly“/>
  </httpHandlers>

<system.web>

Do sekce přidáme element add. Atributem verb určíme vyžadovaný protokol požadavku (GET, POST). Znak * zastupuje všechny protokoly. Atributem path nastavíme, jaké jméno a jakou příponu musejí mít soubory, které zpracovává http handler. Znak * situovaný před tečkou zastupuje libovolné jméno souboru, analogicky, znak * umístěný za tečkou zastupuje všechny přípony.

Když registrujeme handler pro příponu, která není mapována na ASP.NET ISAPI extenzí, tak musíme v konzoli pro správu IIS přidat mapování této přípony na ASP.NET ISAPI extenzi, aby mohl být handler ASP.NET runtimem spuštěn.

Příklad http handleru

Dnes vytvoříme jednoduchý http handler, který vypíše svůj název a hodnoty z kolekce Request.QueryString (zdrojové soubory). V dalších článcích vytvoříme handler pro sofistikované zpracování xml souborů.

Ve VS.NET založíme nový projekt typu „Class library“ s názvem Interval.Examples.HttpHandlers. Přidáme referenci na assembly System.Web.dll. Vytvoříme třídu MyFirstHandler, která musí implementovat rozhraní IHttpHandler.

public class MyFirstHandler : IHttpHandler
{
  …
}

Jedna instance našeho handleru může být použita pro zpracování více požadavků, proto vlastnost IsReusable vrátí vždy true.

bool IHttpHandler.IsReusable
{
  get
  {
    return true;
  }
}

Metoda ProcessRequest generuje odpověď na požadavek uživatele.

void IHttpHandler.ProcessRequest(HttpContext context)
{
  HttpResponse response = context.Response;
  HttpRequest request = context.Request;
  response.ContentType = „text/html“;
  response.Write(„<html><head><title>Zkušebni handler</title></head> <body>“);
  response.Write(@“<h1>První handler z <a href = ‚http://interval.cz‘> Intervalu </a></h1>“);
  response.Write(@“<h2>Hodnoty v Request.QueryString:</h2>“);
  string[] qsKeys = request.QueryString.AllKeys;
  foreach(string key in qsKeys)
    response.Write(„Klíč: “ + key + “   Hodnota: “ + request.QueryString[key] + „<br/>“);
  response.Write(„</body></html>“);
}

V argumentu context je objekt s požadavkem (Request) a objekt pro zaslání odpovědi na klienta (Response). Typ obsahu nastavíme na text/html a vytvoříme html dokument, který kromě staticky vložených nadpisů obsahuje hodnoty a klíče z kolekce Request.QueryString. Http handler zkompilujeme.

Http handler je hotov, nyní jej ještě musíme vyzkoušet. Vytvoříme novou WWW aplikaci s názvem HandlerTest. Dále vytvoříme podadresář bin, do kterého zkopírujeme assembly, jež obsahuje http handler.

I když náš handler s obsahem souboru nepracuje, musíme jej asociovat s příponou souborů, které jím budou “virtuálně“ zpracovávány při požadavku na daný soubor. Protože soubory zpracovávané handlerem budou mít příponu “interval“, v konzoli pro správu IIS namapujeme příponu “interval“ na ISAPI extenzi aspnet_isapi.dll, kterou pro .NET Framework 1.1 naleznete v adresáři <systémový disk>:\WINNT\Microsoft.NET\Framework\v1.1.4322.

Do adresáře HandlerTest přidáme soubor web.config s registrací http handleru pro soubory s příponou interval.

<?xml version=“1.0″ encoding=“utf-8″ ?>
<configuration>
  <system.web>
    <httpHandlers>
      <add verb=“*“
       path=“*.Interval“
       type=“Interval.Examples.HttpHandlers.MyFirstHandler, Interval.Examples.HttpHandlers“/>
    </httpHandlers>
   </system.web>
</configuration>

V adresáři HandlerTest vytvoříme libovolný soubor s příponou interval, například test.interval. Požadavek na soubor test.interval zpracuje náš nový http handler.

Odkazy a zdroje

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět