Microsoft ASP.NET 2.0/3.0 (advanced) Michal Altair Valášek ASP.NET MVP Chief Software Architect Altairis Corporation www.altairis.cz michal.valasek@altairis.cz
Request processing pipeline Michal Altair Valášek ASP.NET MVP Chief Software Architect Altairis Corporation www.altairis.cz michal.valasek@altairis.cz
HTTP.SYS ISAPI ISAPI ISAPI ISAPI ISAPI ISAPI ISAPI ISAPI ISAPI Request execution pipeline (IIS) Virtual Web Virtual Web File system Virtual Web HTTP požadavek
Zpracování požadavků v IIS Veškerá rozšíření jsou v podobě ISAPI filtrů MS: ASP 3.0 MS: ASP.NET 1.0, 1.1, 2.0 MS: SHTML, IDC... 3P: PHP, JSP, ColdFusion Mapování podle nastavení metabáze Podle přípon Wildcard application maps
Nastavení IIS a Wildcard application mapping demo
Machine.config Web.config IHttpModule IHttpModule Request execution pipeline (ASP.NET) IHttpHandler IHttpHandler IHttpHandler ASP.NET ISAPI File system IHttpHandler IHttpHandler HTTP požadavek
Životní příběh jednoho požadavku (..but this is the simplified version for general public!) 1. Událost BeginRequest 2. Autentizace 3. Autorizace 4. Načíst z cache (je-li co) 5. Načíst request state 6. Zavolat odpovídající HTTP handler 7. Uložit request state 8. Uložit do cache 9. Událost EndRequest
Životní příběh jednoho požadavku (1/2) 1. Prověřit, zda požadavek neobsahuje nebezpečné znaky (ValidateRequest=true) 2. Provést URL mapování definované ve web.config 3. Spustit událost BeginRequest 4. Spustit událost AuthenticateRequest 5. Spustit událost PostAuthenticateRequest 6. Spustit událost AuthorizeRequest 7. Spustit událost PostAuthorizeRequest 8. Spustit událost ResolveRequestCache 9. Spustit událost PostResolveRequestCache 10. Vybrat (na základě přípony nebo nastavení ve web.config) třídu implementující IHttpHandler, která zpracuje požadavek 11. Spustit událost PostMapRequestHandler
Životní příběh jednoho požadavku (2/2) 12. Spustit událost AcquireRequestState 13. Spustit událost PostAcquireRequestState 14. Spustit událost PreRequestHandlerExecute 15. Zavolat metodu ProcessRequest vybraného HTTP handleru. 16. Spustit událost PostRequestHandlerExecute 17. Spustit událost ReleaseRequestState 18. Spustit událost PostReleaseRequestState 19. Vyfiltrovat výstup, pokud je definována vlastnost Filter 20. Spustit událost UpdateRequestCache 21. Spustit událost PostUpdateRequestCache 22. Spustit událost EndRequest
HTTP handler Třída implementující IHttpHandler Je zcela zodpovědný za vlastní vyřízení požadavku Koncepčně poněkud připomíná ASP/PHP Obvykle se používá k vracení dat, které nejsou HTML formuláři (obrázky, RSS apod.) Dvě možnosti volání: soubor *.ashx nastavení ve web.configu
Příklad č. 24 HTTP handler hands-on
HTTP handler factory Třída implementující interface IHttpHandlerFactory Dynamicky určuje, která třída se použije jako handler daného požadavku Použití např. pro specifický URL rewriting
Příklad č. 25 HTTP handler factory hands-on
HTTP modul Třída implementující IHttpModule Použije se při každém požadavku Lze v něm vytvořit event handler pro události z request life cycle Obvyklé použití: Modifikace vstupu či výstupu URL rewriting (obecný) Autentizace, autorizace
Příklad č. 26 HTTP moduly hands-on
Komunikace částí pipeline Přímá práce s požadavkem a odpovědí: System.Web.HttpContext.Current.Request System.Web.HttpContext.Current.Response Předávání generických parametrů po pipeline pomocí context items: System.Web.HttpContext.Current.Items[]
URL rewriting Pomocí HTTP handler factory GetCompiledPageInstance() Pomocí HTTP modulů RewritePath() Nutno přepsat ve stránce ještě jednou kvůli relativním odkazům
Příklad č. 12 URL rewriting a lokalizace hands-on
Příklady vestavěných handlerů a modulů HTTP Handlers trace.axd System.Web.Handlers.TraceHandler WebResource.axd System.Web.Handlers.AssemblyResourceLoader *.aspx System.Web.UI.PageHandlerFactory *.asmx System.Web.Services.Protocols.WebServiceHandlerFactory *.config HTTP Modules OutputCache Session System.Web.HttpForbiddenHandler System.Web.Caching.OutputCacheModule System.Web.SessionState.SessionStateModule WindowsAuthentication System.Web.Security.WindowsAuthenticationModule FormsAuthentication System.Web.Security.FormsAuthenticationModule PassportAuthentication System.Web.Security.PassportAuthenticationModule RoleManager System.Web.Security.RoleManagerModule UrlAuthorization System.Web.Security.UrlAuthorizationModule FileAuthorization System.Web.Security.FileAuthorizationModule
ASP.NET Web Forms Nejviditelnější část technologie ASP.NET Jeden z mnoha HTTP handlerů Stromová struktura ovládacích prvků (Controls) Postupné volání eventů ve stromu: Inicializace: shora dolů Ostatní: odspodu nahoru
Obrazy ze života ASPX stránky 1. Start (inicializace vlastností jako Request, Response, nastavení Themes a Master Pages) 2. Page initialization (vytvoření controls, aplikace témat) 3. Load (načtení vlastností z ViewState/ControlState) 4. Validation 5. Postback event handler 6. Rendering (vygenerování výsledného HTML kódu) 7. Unload
Metody a události ASPX stránky (1/2) 1. Constructor 2. Construct 3. TestDeviceFilter 4. AddParsedSubObject 5. DeterminePostBackMode 6. OnPreInit 7. LoadPersonalizationData 8. InitializeThemes 9. OnInit 10. ApplyControlSkin 11. ApplyPersonalization 12. OnInitComplete 13. LoadPageStateFromPersistenceMedium (postback) 14. LoadControlState (postback) 15. LoadViewState (postback)
Metody a události ASPX stránky (2/2) 16. ProcessPostData1 (postback) 17. OnPreLoad 18. OnLoad 19. ProcessPostData2 (postback) 20. RaiseChangedEvents (postback) 21. RaisePostBackEvent (postback) 22. OnLoadComplete 23. OnPreRender 24. OnPreRenderComplete 25. SavePersonalizationData 26. SaveControlState 27. SaveViewState 28. SavePageStateToPersistenceMedium 29. Render 30. OnUnload
Tvorba control tree Tři základní fáze: Init vytvoření Load načtení hodnot Render vykreslení Dva zdroje Hardcoded v ASPX Generované dynamicky Nutno vytvořit včas Nepřežijí postback
Příklad č. 27 Dynamické generování controls hands-on
Base class a HTTP moduly Změna chování celé aplikace Vlastní base class pro stránky Podědit od System.Web.UI.Page Nutno nastavit ve všech případech Složitější, ale má design time support Použití HTTP modulu PreRequestHandlerExecute Možno zapojit konfiguračně Nemá design time support Omezenější možnosti
Příklad č. 11 Použití page base classes hands-on