
A mellékelt példa megnyitása előtt szükséges egy ImageHandler nevű virtuális könyvtár létrehozása, mely a példa könyvtárára mutat. Ehhez futtassa le a mellékelt CreateVD.js parancsállományt.
A példa használatához konfigurálni kell az IIS-t is. Ennek részleteiről az ’IIS-konfiguráció” című bekezdésben olvashat.
A mellékelt példában bemutatjuk, hogy miként jeleníthetünk meg egy képet úgy, hogy az egy assembly erőforrása. Ennek érdekében létrehozunk egy saját kezelőosztályt, mely fogadja a speciális paraméterezéssel rendelkező webes kérést, és kiszolgálja azt. A kezelő az IHttpHandler interfész metódusát és property-jét implementálja. A metódusban valósítjuk meg a kép kiolvasását, és a HTTP adatfolyamba történő kiírását. Annak érdekében, hogy a kezelőnk funkcionáljon, egy speciális kiterjesztést kell megadnunk, melyet a kérésben is szerepeltetnünk kell. Ekkor lép működésbe a saját kezelő modulunk, és szolgálja ki a kérést.
IIS-konfiguráció
A speciális kiterjesztés a .soimg lesz, melyre hivatkozunk a kérésben.
Ennek megadásához az ImageHandler virtuális mappa Tulajdonságlapján, a Virtuális könyvtár fül Konfiguráció feliratú gombjára kell kattintanunk, majd a felbukkanó panelen a Hozzáadás gombra.
A kiterjesztés megadásához ki kell töltenünk a megjelenő dialógusablakot. A Végrehajtható fájlmezőben kell megadnunk, hogy melyik DLL dolgozza fel a kérést. Ez pedig a .NET Framework ASPNET_ISAPI.dll-je, elérési útja a következő:
%winntroot%\Microsoft.NET\Framework\%version%\aspnet_isapi.dll
A művelet után bezárva az IIS konfigurációs paneljét, elkezdhetjük a kódolást. Most már hivatkozhatunk a .soimg kiterjesztésre.
Assembly elkészítése
Az IHandler projekt ImageClass osztályának RenderImage metódusa olvassa be az assembly erőforrásai között szereplő so.gif állományt, majd a WriteImage metódus segítségével küldi azt a kimeneti adatfolyamba.
using(Stream imageStream = a.GetManifestResourceStream(image))
{
using(Image img = Image.FromStream(imageStream))
{
HttpResponse response = HttpContext.Current.Response;
response.ContentType = "image/gif" ;
img.Save(response.OutputStream,ImageFormat.Gif);
}
}
Amennyiben a so.gif állomány hiányzik, vagyis nem nyerhető ki az assembly-ből, akkor a mistake.gif állományt küldi a kimentre.
WriteImage(Assembly.GetExecutingAssembly(),"IHandler.mistake.gif");
HandlerClass osztály létrehozása
A kezelő osztályát tehát az IHttpHandler interfészből származtatjuk.
public class HandlerClass : IHttpHandler
{
...
A ProcessRequest metódust kell implementálni az osztályban, mely meghívja az ImageClass osztály statikus RenderImage metódusát.
public void ProcessRequest(HttpContext context)
{
string assembly = context.Request.QueryString["assembly"];
string image = context.Request.QueryString["imagename"];
ImageClass.RenderImage(assembly,image);
}
A kérés úgy történik, hogy a kezelő megkapja az assembly és a képállomány (erőforrás) nevét egy-egy paraméterben, és ezeket adja át a metódusnak paraméterként.
A Web.config állományban is meg kell adnunk egy hivatkozást a kezelő osztályára, feltüntetve a kiterjesztést.
<httpHandlers>
<add verb="GET" path="*.soimg" type="IHandler.HandlerClass, IHandler" />
</httpHandlers>
Web-alkalmazás létrehozása
A webes alkalmazás WebForm1.aspx lapján nincs más teendőnk, mint hogy egy Image kontrolt helyezünk el a lapon, és beállítjuk a kép forrását. Ezt a következőképpen tehetjük meg:
<asp:Image id="Image1" style="..." runat="server" ImageUrl=".soimg?assembly=IHandler&imagename=IHandler.so.gif">
</asp:Image>
Az assembly és az imagename paraméterekben adjuk meg az erőforrást tároló assembly, és az erőforrás nevét.