C# - Paraméterátadás dinamikus URL-ben

forráskód letöltése
Web-alapú alapú alkalmazásfejlesztés ma már dinamikusan generált Web-tartalmak megjelenítését jelenti, így szükség van arra, hogy oldalaink valamilyen paramétertől függően állítsák össze tartalmukat. Ilyen klasszikus paraméterek egy űrlap kitöltött adatai, vagy HTTP-kérés fejlécében az oldalnak átadott adat, a lap címe után begépelve. Mostani cikkünkben bemutatunk egy olyan lehetőséget, melyben a megadott weboldal neve hordozza az átadandó paramétert.
Vagyis a http://localhost/RequestHandling/Process.aspx?id=25 címzés és paraméterátadás helyett használhatjuk ezt is: http://localhost/RequestHandling/Page25.so. Az eredmény mindkét esetben azonos.
Mellékelt példa megnyitása előtt szükséges egy RequestHandling nevű virtuális könyvtár létrehozása, mely a példa könyvtárára mutat. Ehhez nyissa meg a mellékelt mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
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.
HTTP-kérés feldolgozása
A megoldás ismertetése előtt vegyük sorra, milyen logikai egységeken halad keresztül egy HTTP-kérés amíg eljut alkalmazásunkig.
A kérés első állomása a Web-kiszolgáló szerver szoftvere, jelen esetben az IIS. Az IIS a kérést a kérésből vett információk alapján eljuttatja az ASPNET_ISAPI.dll-hez.
A kérés rögtön továbbítódik az ASP.NET dolgozó-processét reprezentáló ASPNET_WP.exe alkalmazáshoz. A process a kérés fogadása után rögtön készít egy példányt a HTTPContext osztályból, amely beburkolja a kérést.
A kérés csak ezután jut el az adott Web-alkalmazásig, mely a konkrét ASP.NET osztály (például a System.Web.UI.Page osztályból származtatva).
A kérés következő állomása egy Http Module nevezetű egység, mely mindent kezel a felhasználói azonosítástól a Session Management-ig. A Web-szerver ISAPI-filterei a Http Module állomás előtt vagy után helyezhetők el. A .NET Framework az IHttpModule interfészt nyújtja megannyi osztállyal a mind tökéletesebb kód elkészítéséhez.
Utolsó állomás egy Http Handler elnevezésű modul, mely feldolgozza a kérést, és generálja a megfelelő választ. A .NET Framework az IHttpHandler interfész osztályait kínálja ezen funkciók elvégzéséhez. Minden ASP.NET alkalmazás, legyen az akár egy .aspx lap, ilyen kezelő segítségével dolgozza fel a kéréseket.
IIS-konfiguráció
Az ASP.NET technológia segítségével egészen egyedi módon adhatunk át paramétereket egy adott oldalnak, amelyet a megfelelő kezelőosztály metódusaival feldolgozhatunk, és dinamikus tartalmakat állíthatunk elő.
A paraméterátadás említett, és egyszerű módja az, amikor az adott lapnak továbbítandó adatokat a kért lap neve után gépeljük be a böngészőben, valahogy így:
http://localhost/ReguestHandler/Default.aspx?id=25
Az adott oldalon ilyenkor egy kevés kódolással kiolvassuk az átadott paraméterek gyűjteményéből a paramétert, és felhasználjuk a tartalom létrehozásához.
Az ismertetendő megoldásban azonban egy dinamikus URL hordozza az oldalnak átadandó paramétereket. Példánkban egy nem létező oldalra hivatkozunk, és az oldal nevében adjuk át a paramétereket. Az oldal speciális kiterjesztéssel rendelkezik, ehhez pedig saját kezelőt rendeltünk, amely értelmezi és feldolgozza a kérést. A speciális kiterjesztés tetszőleges lehet, a kiterjesztés nevét fel kell venni a Web-szerver kiterjesztés-listájára, és meg kell adni, hogy melyik ISAPI hajtsa végre. A példában a .so kiterjesztést választottuk, mely alkalmazás, webhely, vagy szerver szinten is megadható a Web-szerverben. Mi az alkalmazás szintjén adjuk meg a kiterjesztést.
Ehhez indítsuk el az Internet Szolgáltatáskezelő szoftvert (IIS, megtalálható a „%SystemRoot%\System32\Inetsrv\iis.msc” helyen), majd az adott alkalmazás virtuális könyvtárára (RequestHandling) a jobb egérgombbal kattintva válasszuk a Tulajdonságok menüpontot. A kezelőfelületen a Virtuális könyvtár fülön kattintsunk a Konfiguráció gombra, majd a megjelenő ablak Alkalmazások hozzárendelése fülön a Hozzáadás gombra.
A program szerkesztődobozban kell megadni, 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
Adjuk meg a kiterjesztést, majd a műveleteket, melyek GET, POST és DEBUG. Állítsuk a parancsfájlt végrehajthatóra, a jelölőnégyzet igazra állításával. Az OK gombra kattintva megtörténik a kiterjesztésünk felvétele a listába.
Web.config beállítása
Ahhoz, hogy a beérkezett kérések értelmeződjenek, meg kell adnunk alkalmazásszinten egy kezelő osztályt. Az ASP.NET alkalmazások konfigurációs állományában, a Web.config állományban tegyük meg a következő bejegyzést:
<configuration>
  <system.web>
  <httpHandlers>
    <add verb="*" path="*.so" type="RequestHandling.SOHandler,RequestHandling"/>
    </httpHandlers>
  </system.web>
</configuration>
A </httpHandlers> tag attribútumaival adható meg az alapértelmezett kezelő a speciális kiterjesztésű kérésekhez. A támogatott subtag-ek:
SubTag Jelentés Attribútum Funkció
<add> Megadható, hogy adott műveletekre és kiterjesztésekre mely osztály a kezelő. verb A műveletek, melyre a kezelőt specifikáltuk.
- - path Kiterjesztés.
- - type Osztálynév,Assembly-név párosítás.
<remove> Eltávolítható bizonyos felülről örökölt művelet és kiterjesztés. verb Művelet, melyet eltávolítunk a listából.
- - path Kiterjesztés.
<clear> Az összes összerendelés eltávolítható. - -
Amikor IIS Web-szerverünket az előző lépésben konfiguráltuk, megadtuk a verb attribútum értékét, vagyis az elvégzendő műveleteket, így ez most ’*’ karaktert kap értékként. A type attribútum kicsit érdekesebb, itt ugyanis meg kell adnunk, hogy mely kezelőosztályt használjuk fel a kérés értelmezéséhez, valamint hogy ezt mely assembly-ben találja meg a CLR.
Az osztály nevét névtérrel adjuk meg, az assembly neve az, ami az alkalmazás dll-jének is a neve kiterjesztés nélkül, vagyis RequestHandling.
Alkalmazás kódja
A konfigurációs beállítások után lássuk, milyen kódot kell tartalmazni az alkalmazásnak ahhoz, hogy feldolgozhassa kérésünket.
Példánkban a RequestHandling ASP.NET program két WebForm-ot tartalmaz: az egyik neve Default.aspx, a másik pedig Process.aspx. A kezelőosztályt a Default.aspx.cs állomány tartalmazza, ez az alkalmazás kezdőlapja is. A kezdőlapon található egy link arra a bizonyos lapra, mely nem létezik ugyan, viszont címének összetevői paraméterként szolgálnak.
A kezelőosztályt az IHttpHandler interfészből kell származtatni, így rendelkezésre állhat annak IsReusable property-je, valamint ProcessRequest metódusa.
IsReusable
bool IsReusable {get;}
Meghatározza, hogy a kezelő felhasználható-e a következő kérésekben. True érték esetében igen, egyébként nem. Példánkban értéke False.
ProcessRequest
Osztály: IHttpHandler
void ProcessRequest(
HttpContext context
);
A kezelő lényege, mely feldolgozza a kérést az általunk megírt kóddal.
Paraméterek
HttpContext context
A kérést beburkoló osztály, mely rendelkezésre bocsátja Request és Response objektumait.
Lássuk a kódot részletesen. Létrehozzuk a RequestHandling névtérben a SOHandler kezelőosztályt:
public class SOHandler : IHttpHandler
{
  public SOHandler()
  {
  }
Megadjuk az IsReusable property értékét:
public bool IsReusable
{
  get {return false;}
}
Majd a kezelő metódusában feldolgozzuk a kérés karakterláncát:
public void ProcessRequest(HttpContext context)
{
  string url = context.Request.Url.ToString();
A karakterlánccal létrehozunk egy Uri osztályú objektumot, melynek LocalPath property-je megadja a fizikai elérési útvonalat:
Uri localUrl = new Uri(url);
string Params = localUrl.LocalPath.ToString();
A karakterláncot feldolgozva kihámozzuk a kért oldal nevéből a szignifikáns paramétert, mely példánkban a „/Pagexx.so” formájú oldal kérésekor ’xx’ tetszőleges érték, mely ezután szabadon felhasználható. Alkalmazásunkban ezt az értéket átadtuk paraméterként a Process.aspx oldalnak:
int posSlash = Params.LastIndexOf("/");
int posPoint = Params.LastIndexOf(".");
Params = Params.Remove(posPoint,3);
string SubParam = Params.Substring(posSlash + 5);
context.Response.Redirect("Process.aspx?id=" + SubParam);
A Process.aspx oldalon futó megjelenítő kód:
NameValueCollection coll = new NameValueCollection(); 
coll = Request.QueryString;
ParamLabel.Text = coll["id"];
A kérés tehát a következő volt teljes egészében, ahol a kért oldal fizikailag nem létező erőforrást takar, az átadott paraméter 25:
http://localhost/RequestHandling/Page25.so
Oldalainknak így tetszőleges karakterláncokat átadhatunk paraméterként, hogy ezeket egy fájl nevében rejtjük el, vagy az elérési útvonalat duzzasztjuk fel ezekkel (például http://localhost/RequestHandling/Paramétermappa/Page.so, ahol „Paramétermappa” lehet valamilyen átadandó adat), a fejlesztőn múlik.