540 likes | 658 Views
ASP.NET 4.0 Állapot menedzsment, oldal életciklus. Krizsán Zoltán ver 1.1. Állapot nyilvántartás okai. http állapot mentes Ugyanaz a kliens több kérésén keresztül információkat tartunk valahol. Az oldalakat minden kérés alkalmával felépítik. Az oldalakat minden válasz után lebontják.
E N D
ASP.NET 4.0 Állapot menedzsment, oldal életciklus Krizsán Zoltán ver 1.1
Állapot nyilvántartás okai • http állapot mentes • Ugyanaz a kliens több kérésén keresztül információkat tartunk valahol. • Az oldalakat minden kérés alkalmával felépítik. • Az oldalakat minden válasz után lebontják.
Globális események: global.asax • kéréshez kapcsolódó eseménykezelők, • bizonyos feltételekre reagáló eseménykezelők • Application_Start • Session_Start • Application_Error: kezeletlen kivétel • Session_End • Application_End • Application_Disposed: biztos, ami biztos takarítás
Oldal életciklus szakaszaihttp://msdn.microsoft.com/en-us/library/ms178472.aspx
PreInit esemény • Start szakasz után, de még az inicializálás előtt • Használhatjuk a IsPostBack tulajdonságot. • Mire használjuk • vezérlők dinamikus létrehozása • mester oldalak dinamikus beállítása • téma dinamikus beállítása
Oldal inicializálás • Init esemény • A vezérlők Init eseményei után. • Skin alkalmazása után. • Vezérlők tulajdonságainak olvasása, beállítása. • InitComplete esemény • Inicializáló szakasz végén. • Itt már érvényes a ViewState. • A ViewState módosítása itt javasolt.
Oldal betöltése • OnLoad oldal metódus • adatbázis kapcsolat létrehozása itt • OnLoad metódusa a vezérlőknek • Load eseménye az oldalnak • Load eseménye a vezérlőknek • Vezérlők eseménykezelői • LoadComplete
Vezérlők eseményei • A megfelelő vezérlő, • megfelelő eseménye • kliens oldali aktivitás alapján. • Érdemes használni az IsValid tulajdonságát az oldalnak.
Kód generálás • PreRender esemény • PreRenderComplete esemény • DataBind() után • SaveStateComplete esemény • Render metódusa hívódik minden vezérlőnek • saját vezérlőnél ezt írjuk felül.
Oldal kisöprés • Unload esemény • szüntessük meg az utóhatásokat • adatbázis kapcsolatok lebontása • fájlok zárás • loggok • nem használhatjuk a Response objektum írásra pl. Write metódust.
Állapotmentés, de melyiket? • Mekkora információt kell tárolni? • Kliensnél engedélyezett a süti? • Szerver vagy kliens oldalon lenne hasznos? • A tárolandó adat érzékeny? • Melyek a teljesítmény sávszélesség követelmények? • Felhasználónként kell tárolni? • Meddig kell tárolni az információt? • Osztott a webapp (web farm)?
Kliens oldali lehetőségek • View state • Control state • Hidden fields<asp:HiddenField /> • Cookies • Query strings
ViewState jellemzői • Nincs szerver oldali erőforrás szükséglete • Egyszerű használat • Biztonságosabb, mint a rejtett mezők (hash-elt, tömörített, kódolt, de nem titkosított) • Nagy méret esetén lassít. • Nem mindig támogatott (mobil eszközök). • Biztonsági kockázat (mégiscsak a kódban van)
ControlState • Nincs szerver oldali erőforrás szükséglete. • Mindig működik, nem lehet letiltani. • Macerás használni • saját vezérlő • OnInit felüldefiniálás • SaveControlState • LoadControlState
Rejtett mezők • Nincs szerver oldali erőforrás szükséglete. • Biztos, hogy működik. Mindenki támogatja. • Kódolni kell, de a használat egyszerű. • Biztonsági kockázat. • Tartalma csak szöveg lehet. • Sok, nagy adat -> lassú oldal. • Nagy méret gond lehet az átvitel során.
Süti • Nincs szerver oldali erőforrás szükséglete. • Konfigurálható érvényesség. • Egyszerű: kulcs – érték pár • Méret korlát (4096, mostanában 8192) • Letiltható a kliensben. • Biztonsági kockázat. • Érték csak szöveg lehet.
Querystring • Nincs szerver oldali erőforrás szükséglete. • Biztos, hogy működik. Mindenki támogatja. • Kódolni kell, de a használat egyszerű. • Méret korlát (2083) • Biztonsági kockázat. • Érték csak szöveg lehet.
Állapot menedzsmentViewState • Beépített mechanizmus, • de kiterjeszthető • saját elemeket is kezel, ViewState[control.ID] = érték • ki lehet olvasni kódból is explicit módon, • objektum is lehet benne • Minden változott értéket ment/tölt (nem csak szöveg). • 4.0-tól kezdődően szelektív támogatás is lehet. • Ne használjuk, ha az érték amúgy is jön!
ViewState • Tiltani lehet • elemenként, • egész oldalra <%@ Page Language="C#" EnableViewState="false" ... %>, • konfigurációból:<configuration><system.web><pages enableViewState="false" /></system.web></configuration> • Öröklődik az EnableViewState (inherited)
Objektum tárolása a ViewState-benObjektum sorosíthatósága [Serializable] publicclassCustomer { publicstringFirstName; publicstringLastName; public Customer(stringfirstName, stringlastName) { FirstName = firstName; LastName = lastName; } }
Objektum tárolása a ViewState-benObjektum tárolása, kivétele Customercust = newCustomer(”név",”név2"); ViewState["CurrentCustomer"] = cust; cust = (Customer)ViewState["CurrentCustomer"];
Süti használata Ikulcs – érték használat Response.Cookies["userName"].Value = "patrick"; Response.Cookies["userName"].Expires = DateTime.Now.AddDays(1); HttpCookieaCookie = newHttpCookie("lastVisit"); aCookie.Value= DateTime.Now.ToString(); aCookie.Expires= DateTime.Now.AddDays(1); Response.Cookies.Add(aCookie);
Süti használata IIkulcs – alkulcs - érték használat Response.Cookies["userInfo"]["userName"] = "patrick"; Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString(); Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1); HttpCookieaCookie = newHttpCookie("userInfo"); aCookie.Values["userName"] = "patrick"; aCookie.Values["lastVisit"] = DateTime.Now.ToString(); aCookie.Expires= DateTime.Now.AddDays(1); Response.Cookies.Add(aCookie);
Süti használata IIIhatókőr szűkítés - mappára HttpCookieappCookie = newHttpCookie("AppCookie"); appCookie.Value= "written " + DateTime.Now.ToString(); appCookie.Expires= DateTime.Now.AddDays(1); appCookie.Path= "/Application1"; Response.Cookies.Add(appCookie);
Süti használat IVtörlés aCookie.Expires = DateTime.Now.AddDays(-1); aCookie.Values.Remove(subkeyName);
Querystring használata • Olvasás Request.QueryString["Name"]; vagy Request.QueryString[0]; • Írás Response.Redirect("WebForm2.Aspx?" + "Name=" + Server.UrlEncode(this.txtName.Text) + "&LastName=" + Server.UrlEncode(this.txtLastName.Text));
Szerver oldali állapot menedzsment • Application state • Session state • Profile properties • Database support (külön diasorozat)
Application • Egyszerű használat. • Alkalmazás – globális hatókör. • Alkalmazás – globális hatókör. • Elveszhet, ha a szerver kisöpri a webapp-ot. • Szerver memóriában van.
Session • Egyszerű használat. • Események. • IIS átmenti ha ki kell söpörni a webapp-ot. • Süti nélkül is használható. • Kiterjeszthető. • Érvényességi idő. • Érvényességi idő (max). • Teljesítmény veszteséggel jár.
proflie tulajdonságok • Felhasználóhoz kötődik. • Kiterjeszthető • IIS menti állapotát ha ki kell söpörni a webapp-ot. • Teljesítmény veszteséggel jár. • Konfigurációt igényel • Gondoskodni kell felszabadításról.
Sessionadat tárolási módok • SessionStateMode felsorolt típus: • InProc: a web szerver memóriájában (default) • StateServer: ASP.NET állapot szerviz tárolja, külön processzben. Web farm esetén is használható, ha újraindul a webapp, akkor is megmaradnak a változó értékei. • SQLServer: adatb-ben tárolja. Web farm esetén is használható, ha újraindul a webapp, akkor is megmaradnak a változó értékei. • Custom: saját megoldás • Off: nincs
SessionÁllapot szerver (State server) - beállítás <configuration> <system.web> <sessionStatemode="StateServer" stateConnectionString="tcpip=SampleStateServer:42424" cookieless="false" timeout="20"/> </system.web> </configuration>
SessionSQL szerver- beállítás <configuration> <system.web> <sessionStatemode="SQLServer" sqlConnectionString="Integrated Security=SSPI;data source=SampleSqlServer;"/> </system.web> </configuration>
Session használata Mentés: stringfirstName = "Jeff"; stringlastName = "Smith"; stringcity = "Seattle"; Session["FirstName"] = firstName; Session["LastName"] = lastName; Session["City"] = city; Ellenőrzés: if (Session["City"] == null) Olvasás: stringfirstName = (string)(Session["First"]); stringlastName = (string)(Session["Last"]); string city = (string)(Session["City"]);
Profile előfeltétel • MS SQL | SQL Express adatbázis • aspnet_regsql.exe futtatása (legalább –A p) • Táblában tárol: aspnet_Profile • alapértelmezetten csak authentikált felhasználónak • Írás: Context.Profile["cim"] = "Hello"; • Olvasás: Label1.Text = (String)Context.Profile["cim"];
Profile • Konfigurációban szerepeltetni kell: • <profile> • <providers> • <clear/> • <addname="AspNetSqlProfileProvider"type="System.Web.Profile.SqlProfileProvider" • connectionStringName="ApplicationServices"applicationName="/"/> • </providers> • <properties> • <addname="cim"type="String"/> • </properties> • </profile> • Ezután használható:Context.Profile[”cím”] = "Hello"; • Feladat: http://msdn.microsoft.com/en-us/library/taab950e.aspx
Alkalmazás objektum használata Írás: Application.Lock(); Application["Message"] = ”Szöveg"; Application["PageRequestCount"] = 0; Application.UnLock(); Olvasás: if(Application["AppStartTime"] != null) { DateTimemyAppStartTime = (DateTime)Application["AppStartTime"]; }
Cache • Alkalmazás cache • globális jellegű tárolók, az egész webapp gyorsítására • DataSet-ek, riportok, adatok, melyek megmaradnak kérések között. • Oldal cache • Az oldal kimenetét tárolja, amit nem kell generálni.
Alkalmazás Cache • Objektumokat tárolhatunk ideiglenesesen. • Ha a webapp újraindul, akkor a cache is újraépül. • kulcs – érték párokat tárol. • Prioritás rendelhető az elemhez. • volatile – bár globális jellegű, de nem az alkalmazással együtt él. • kisöprődik • ha lejárt az érvényessége, • ha érvénytelenné válik, • ha kevés a memória.
Cache lejárat, érvényesség • Sliding expiration (csúszó lejáratú)Miután elérték az elemet meddig maradjon még bent. • Absolute expirationPontosan meddig maradjon bent (használattól függetlenül).
Cache függőség • Megadhatunk függőséget (file, db,…) • Ha változik amitől függ, akkor kisöprik az elemünket. • Függőséget fajtái: • kulcs: megadhatjuk a másik cache-ben tárolt elem kulcsát • file: ha a külső fájl módosult, vagy törölték, akkor kisöprik. • sql: ha az adatbázis egy táblája változik. • csoport (aggregate): Ha több elemtől is függ. Bármelyik változik, kisöprik. • saját (custom)
Cache használatéték beillesztés Cache["CacheItem1"] = "Cached Item 1"; Cache.Insert("CacheItem2", ”szöveg2"); string[] dependencies = { "CacheItem2" }; Cache.Insert("CacheItem3", "Cached Item 3",newSystem.Web.Caching.CacheDependency(null, dependencies)); Cache.Insert("CacheItem7", "Cached Item 7", null, System.Web.Caching.Cache.NoAbsoluteExpiration, newTimeSpan(0, 10, 0)); Cache.Insert("CacheItem8", "Cached Item 8", null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.High, null);
Cache használata • Kiolvasás cachedString = (string)Cache["CacheItem"]; • Törlés Cache.Remove("MyData1");
Cache használatakisöprés figyelés privatestaticstringGenerateAndCacheReport(){ string report = "Report Text. " + _lastRemoved.ToString(); HttpRuntime.Cache.Insert( "MyReport", report, null, Cache.NoAbsoluteExpiration, newTimeSpan(0, 0, 15), CacheItemPriority.Default, newCacheItemRemovedCallback(ReportRemovedCallback)); return report; } publicstaticvoidReportRemovedCallback(String key, object value, CacheItemRemovedReasonremovedReason){ _lastRemoved = "Re-created " + DateTime.Now.ToString(); }
Feladat • +: növeli 1el • -: csökkenti 1el, ha + szám • 0: nulláz • Próbáljuk ki az össze lehetőséget! • Próbáljuk ki ugyanazon böngésző különböző ablakaiból! • Próbáljuk ki másik böngészőből!
Feladat II - sütivel • Ha ne a ViewState-el oldjuk meg a feladatot, akkor tiltsuk le a támogatás false -> EnableViewState • Böngésző egyik ablakában növeljük, majd másik ablakában is növeljük (felváltva)! • Mi történik? Miért? • Lehetőleg központilag töltsünk mentsünk, ne az esemény kezelőben! (1 helyen kell átírni, ellenőrizni) • OnLoad-ban lehet betölteni, kimenteni nem lehet az unloadban (kivétel) • Request.Cookies[”kulcs”], response.Cookies[”kulcs”] gyűjtemény, vagy Request.Params[”kulcs”], Request[”kulcs”]