asp.net 4.0 Állapot menedzsment, oldal életciklus
DESCRIPTION
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. - PowerPoint PPT PresentationTRANSCRIPT
ASP.NET 4.0 Állapot menedzsment,
oldal életciklusKrizsán Zoltán
ver 1.1
2
Állapot nyilvántartás okaihttp állapot mentesUgyanaz 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.
3
Globális események: global.asaxké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
4
Kérés – válasz események sorrendje
5
Kérés kiszolgálás menete IIS 7
6
Oldal életciklus szakaszaihttp://msdn.microsoft.com/en-us/library/ms178472.aspx
1. Page request: újra kell e fordítani, vagy mehet cache-ből2. Start: Request, Response, IsPostBack tulajdonságok beállítása3. Initialization: mester oldal, és téma hozzárendelés4. Load: viewstate-ből az adatok a vezérlőkbe5. Postback event handling: ha postback volt, akkor ennek a feldolgozása. A végén adatellenőrzés.6. Rendering: Előtte a view state-be menti az állapotokat. Hívja a vezérlők Render() metódusát, amik a válasz kimenetére írják a megfelelő TAG-eket.7. Unload: vezérlők kisöprése.
7
PreInit eseményStart szakasz után, de még az inicializálás előttHaszná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
8
Oldal inicializálásInit 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.
9
Oldal betöltése1. OnLoad oldal metódus
adatbázis kapcsolat létrehozása itt2. OnLoad metódusa a vezérlőknek3. Load eseménye az oldalnak4. Load eseménye a vezérlőknek5. Vezérlők eseménykezelői6. LoadComplete
10
Vezérlők eseményeiA megfelelő vezérlő,megfelelő eseményekliens oldali aktivitás alapján.Érdemes használni az IsValid tulajdonságát az oldalnak.
11
Kód generálás1. PreRender esemény2. PreRenderComplete esemény
DataBind() után3. SaveStateComplete esemény4. Render metódusa hívódik minden vezérlőnek
saját vezérlőnél ezt írjuk felül.
12
Oldal kisöprésUnload 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.write metódust.
13
Teljes életciklusábra
14
Á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)?
15
Kliens oldali lehetőségekView stateControl stateHidden fields
<asp:HiddenField />CookiesQuery strings
16
ViewState jellemzőiNincs szerver oldali erőforrás szükségleteEgyszerű használatBiztonsá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)
17
ControlStateNincs 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
18
Rejtett mezőkNincs 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.
19
SütiNincs szerver oldali erőforrás szükséglete.Konfigurálható érvényesség.Egyszerű: kulcs – érték párMéret korlát (4096, mostanában 8192)Letiltható a kliensben.Biztonsági kockázat.Érték csak szöveg lehet.
20
Query stringNincs 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.
21
Á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!
22
ViewStateTiltani 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)
23
Objektum tárolása a ViewState-benObjektum sorosíthatósága
[Serializable] public class Customer { public string FirstName; public string LastName; public Customer(string firstName, string lastName) { FirstName = firstName; LastName = lastName; } }
24
Objektum tárolása a ViewState-benObjektum tárolása, kivétele
Customer cust = new Customer(”név",”név2"); ViewState["CurrentCustomer"] = cust;
cust = (Customer)ViewState["CurrentCustomer"];
25
Süti használata Ikulcs – érték használat
Response.Cookies["userName"].Value = "patrick";Response.Cookies["userName"].Expires = DateTime.Now.AddDays(1);
HttpCookie aCookie = new HttpCookie("lastVisit");aCookie.Value = DateTime.Now.ToString();aCookie.Expires = DateTime.Now.AddDays(1);Response.Cookies.Add(aCookie);
26
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);
HttpCookie aCookie = new HttpCookie("userInfo");aCookie.Values["userName"] = "patrick";aCookie.Values["lastVisit"] = DateTime.Now.ToString();aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);
27
Süti használata IIIhatókőr szűkítés - mappára
HttpCookie appCookie = new HttpCookie("AppCookie");appCookie.Value = "written " + DateTime.Now.ToString();appCookie.Expires = DateTime.Now.AddDays(1);appCookie.Path = "/Application1"; Response.Cookies.Add(appCookie);
28
Süti használat IVtörlés
aCookie.Expires = DateTime.Now.AddDays(-1);
aCookie.Values.Remove(subkeyName);
29
Query string használata OlvasásRequest.QueryString["Name"];vagyRequest.QueryString[0];
ÍrásResponse.Redirect("WebForm2.Aspx?" +"Name=" + Server.UrlEncode(this.txtName.Text) +"&LastName=" + Server.UrlEncode(this.txtLastName.Text));
30
Szerver oldali állapot menedzsmentApplication stateSession stateProfile propertiesDatabase support (külön diasorozat)
31
ApplicationEgyszerű 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.
32
SessionEgyszerű 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.
33
proflie tulajdonságokFelhaszná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ényelGondoskodni kell felszabadításról.
34
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
35
SessionÁllapot szerver (State server) - beállítás
<configuration> <system.web> <sessionState mode="StateServer" stateConnectionString="tcpip=SampleStateServer:42424" cookieless="false" timeout="20"/> </system.web></configuration>
36
SessionSQL szerver- beállítás
<configuration> <system.web> <sessionState mode="SQLServer" sqlConnectionString="Integrated Security=SSPI;data source=SampleSqlServer;" /> </system.web></configuration>
37
Session használataMentés:string firstName = "Jeff";string lastName = "Smith";string city = "Seattle";Session["FirstName"] = firstName;Session["LastName"] = lastName;Session["City"] = city;
Ellenőrzés:if (Session["City"] == null)
Olvasás:string firstName = (string)(Session["First"]);string lastName = (string)(Session["Last"]);string city = (string)(Session["City"]);
38
Profile előfeltételMS SQL | SQL Express adatbázisaspnet_regsql.exe futtatása (legalább –A p)Táblában tárol: aspnet_Profilealapértelmezetten csak authentikált felhasználónakÍrás:Context.Profile["cim"] = "Hello";Olvasás:Label1.Text = (String) Context.Profile["cim"];
39
Profile Konfigurációban szerepeltetni kell: <profile> <providers> <clear/> <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> </providers> <properties> <add name="cim" type="String"/> </properties> </profile>Ezután használható:Context.Profile["Name"] = "Hello";
Feladat:http://msdn.microsoft.com/en-us/library/taab950e.aspx
40
Alkalmazás objektum használataÍrás:Application.Lock();Application["Message"] = ”Szöveg";Application["PageRequestCount"] = 0;Application.UnLock();
Olvasás:if (Application["AppStartTime"] != null){ DateTime myAppStartTime = (DateTime)Application["AppStartTime"];}
41
CacheAlkalmazá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 cacheAz oldal kimenetét tárolja, amit nem kell generálni.
42
Alkalmazás CacheObjektumokat 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.
43
Cache lejárat, érvényességSliding 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).
44
Cache függőségMegadhatunk 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)
45
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", new System.Web.Caching.CacheDependency(null, dependencies));
Cache.Insert("CacheItem7", "Cached Item 7", null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(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);
46
Cache használataKiolvasáscachedString = (string)Cache["CacheItem"];
TörlésCache.Remove("MyData1");
47
Cache használatakisöprés figyelés
private static string GenerateAndCacheReport(){ string report = "Report Text. " + _lastRemoved.ToString();
HttpRuntime.Cache.Insert( "MyReport", report, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 15), CacheItemPriority.Default, new CacheItemRemovedCallback(ReportRemovedCallback));
return report; }
public static void ReportRemovedCallback(String key, object value, CacheItemRemovedReason removedReason){ _lastRemoved = "Re-created " + DateTime.Now.ToString(); }