ASP.NET 4.0 Állapot menedzsment, oldal életciklus

54
ASP.NET 4.0 Állapot menedzsment, oldal életciklus Krizsán Zoltán ver 1.1

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 Presentation

Transcript of ASP.NET 4.0 Állapot menedzsment, oldal életciklus

Page 1: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

ASP.NET 4.0 Állapot menedzsment,

oldal életciklusKrizsán Zoltán

ver 1.1

Page 2: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

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.

Page 3: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

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

Page 4: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

4

Kérés – válasz események sorrendje

Page 5: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

5

Kérés kiszolgálás menete IIS 7

Page 6: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

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.

Page 7: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

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

Page 8: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

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.

Page 9: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

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

Page 10: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

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.

Page 11: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

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.

Page 12: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

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 objektum írásra pl. Write metódust.

Page 13: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

13

Teljes életciklusábra

Page 14: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

14

Életciklus, eseménykezelő metódusok létrehozása

Page method Page event Control method & event

Default akciók felülírása.Forrás kódban override kulcsszó, majd kiválasztani (varázsló generálja)

Kiegészítő akciók.Megfelelő aláírású függvény létrehozása kézzel.protected void Page_xxx(object sender, EventArgs e) (xxx az előző táblazatbó).Pl. Page_Load, Page_Init(Page_Load már van, ctrl+c, ctrl+v majd Load átírása a másikra.)

Vezérlőn duplaklikkel, vagy property editor events füllel.

Page 15: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

15

Á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)?

Page 16: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

16

Kliens oldali lehetőségekView stateControl stateHidden fields

<asp:HiddenField />CookiesQuery strings

Page 17: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

17

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)

Page 18: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

18

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

Page 19: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

19

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.

Page 20: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

20

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.

Page 21: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

21

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.

Page 22: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

22

Á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!

Page 23: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

23

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)

Page 24: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

24

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; } }

Page 25: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

25

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"];

Page 26: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

26

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);

Page 27: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

27

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);

Page 28: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

28

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);

Page 29: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

29

Süti használat IVtörlés

aCookie.Expires = DateTime.Now.AddDays(-1);

aCookie.Values.Remove(subkeyName);

Page 30: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

30

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));

Page 31: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

31

Szerver oldali állapot menedzsmentApplication stateSession stateProfile propertiesDatabase support (külön diasorozat)

Page 32: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

32

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.

Page 33: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

33

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.

Page 34: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

34

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.

Page 35: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

35

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

Page 36: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

36

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>

Page 37: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

37

SessionSQL szerver- beállítás

<configuration> <system.web> <sessionState mode="SQLServer" sqlConnectionString="Integrated Security=SSPI;data source=SampleSqlServer;" /> </system.web></configuration>

Page 38: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

38

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"]);

Page 39: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

39

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"];

Page 40: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

40

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[”cím”] = "Hello";

Feladat:http://msdn.microsoft.com/en-us/library/taab950e.aspx

Page 41: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

41

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"];}

Page 42: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

42

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.

Page 43: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

43

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.

Page 44: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

44

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).

Page 45: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

45

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)

Page 46: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

46

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);

Page 47: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

47

Cache használataKiolvasáscachedString = (string)Cache["CacheItem"];

TörlésCache.Remove("MyData1");

Page 48: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

48

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(); }

Page 49: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

49

Feladat+: növeli 1el-: csökkenti 1el, ha + szám0: 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!

Page 50: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

50

Feladat II - sütivelHa ne a ViewState-el oldjuk meg a feladatot, akkor tiltsuk le a támogatás false -> EnableViewStateBö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”]

Page 51: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

51

feladat - viewStatetrue -> EnableViewStateeseménykezelőben megfelelő művelet.

Page 52: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

52

feladat – rejtett mezővelStandard – HiddenField – Value tulajdonság (esetleg value changer)HTML – Input (Hidden) runat=”server” – Value tulajdonságBeolvasás a használat előtt

figyelni, hogy első alkalom e! (IsPostback true)Kiírni a Render előtt!

Page 53: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

53

feladat – QueryStringOlvasni használat előtt!

IsPostBack Server.UrlDecode Request.QueryString[”kulcs”], vagy Request.Params[”kulcs”],

vagy Request[”kulcs”] HyperLink.NavigateUrl vezérlő, vagy a Button.PostBackUrl írni a render előtt! KÓDOLÁS!

Server.UrlEncode Button.PostBackUrl: WebForm_PostBackOptions, ami a <script

src="/WebResource.axd?d=-ből jön.

Page 54: ASP.NET 4.0  Állapot menedzsment, oldal életciklus

54

feladat – session, Application, cacheBármikor berakhatjuk, kivehetjük az adatokat.Bármilyen típus lehet = nem kell stringgé alakítani.