asp.net 4.0 Állapot menedzsment, oldal életciklus

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

Upload: unity-ball

Post on 04-Jan-2016

31 views

Category:

Documents


0 download

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

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

Á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 15: ASP.NET  4.0  Állapot  menedzsment, oldal életciklus

15

Kliens oldali lehetőségekView stateControl stateHidden fields

<asp:HiddenField />CookiesQuery strings

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

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)

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

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

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

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.

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

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.

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

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.

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

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!

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

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)

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

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

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

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

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

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

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

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

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

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

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

28

Süti használat IVtörlés

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

aCookie.Values.Remove(subkeyName);

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

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

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

30

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

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

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.

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

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.

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

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.

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

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

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

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>

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

36

SessionSQL szerver- beállítás

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

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

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

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

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

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

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

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

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

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

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.

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

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.

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

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

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

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)

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

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

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

46

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

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

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

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