Zobrazovanie Exception pri chybe v ASP.NET app

Občas by ste možno prijali (rovnako ako ja) možnosť zobraziť si bližší popis chyby už nasadenej aplikácie, prípadne aby sa popis chyby zobrazoval len presne vybraným IP. Takúto funkcionalitu nemá ASP.NET out-of-the-box, čo je škoda. V rámci jedného projektu som dostal za úlohu vyriešiť presne takého zobrazovanie. Nuž, prečo sa nepodeliť :) (iste, toto je len jeden z mnohých spôsobov ako zobrazovať chybu, kľudne sa podeľte aj o tie vaše)

ASP.NET ponúka veľmi milú možnosť stanoviť si vo web.config na ktoré stránky v prípade chyby budeme redirektovať. O redirekt sa stará sám run time a tým, že sú stránky oddelené od kódu, získavame celkom peknú možnosť si ich zmeniť aj po nasadení. Celkom konkrétne sa dajú tieto stránky nastavovať v sekcii customErrors. Viac o nastavení sa dozviete na msdn. ASP.NET samé ponúka možnosť v property mode uzla customErrors nastaviť zobrazovanie aj RemoteOnly, teda detailný popis chyby pre Remote requesty, lokálne sa teda predpokladá, že vývojár má prístup k mašine s IIS, čo však mať nemusí, ak je stroj v infraštruktúre zákazníka a VPN vám nedovolí.

V jednotlivých uzloch si nastavíte kód chyby a stránku kam redirektujete. Napr. aj takto : <error statusCode="500" redirect="~/ErrorPages/InternalError.aspx" />

Ak sa chceme dostať ku chybe špecifickej pre našu session, zvolil som postup uložiť si Exception do session. K Exception sa dostaneme cez HttpContext.Current.Server.GetLastError(); a keďže objekt Server je singleton (teda mám ten pocit, ak sa mýlim opravte ma), odkladám si teda chybu do session a prenášam na chybovú stránku.

Tu však nastal zaujímavý problém. Pre problémy s miznutím niektorých uložených vecí zo session (písal som o tom v predchádzajúcom poste) som skúšal postup s nastavením session na typ StateServer. Tento typ serializuje všetky objekty, ukladá ich do samostatného procesu (všetko čo ukladáme do session musí mať atribút [Serializable]) a je "bezpečnejší". Na moje zdesenie, ak som použil StateServer, moja Exception proste zo session zmizla, ale iný objekt tam ostal. Ak som použil session InProc, Exception ostala. Veľmi zaujímavé. AK sa nájde niekto, kto potrebuje používať StateServer, mám pre neho workaround, v OnError Page môže redirektovať (v priloženom example som nechal riadok vykomentovaný), ak mu stačí InProc, nemusí ho použiť. Samozrejme ručným redirektovaním dosiahneme to, že nastavenia pre chybu číslo 500 vo web.config budú ignorované (o lepšom spôsobe problému neviem :().

No a nakoniec - pre zobrazovanie chyby som použil custom Web User Control, jeden taký "všeobecný" pre prípadné neskoršie použite a jeden, ktorý sa sám naplní zo session a dáva pozor na nastavenia vo web.cofig, pre ktoré IP chceme zobrazovať chyby a či vôbec chceme zobrazovať chyby.

Teda čo potrebujete urobiť, aby ste tento zázrak rozbehali u seba?

  • Používať customErrors -  stránky na ktoré presmerujete, ak nastane chyba,
  • Vložiť oba Web User Control-y do projektu
  • Na požadované stránky vložiť SessionDetailedError.ascx User Web Control
  • Vložiť 3 appSettings kľúče do web.config
A tým by ste mali mať krajšie chybové hlášky. :)

Nejaký nápad na vylepšenie, alebo som "vynašiel koleso"?

PS: pre úplnosť, ale to som v priloženej sample app neriešil odporúčam použiť ELMAH a príp. aj explicitné logovanie dľa vášho gusta.

AD1: Niečo viac o ukladaní celých controls do Session a prečo to nieje dobrý nápad, sa dočítate tu.
Publikované Tuesday, April 06, 2010 9:53 AM dudok

Komentáre

Bez komentárov