asp.net 4.0 Állapot menedzsment, oldal életciklus

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

Upload: winter

Post on 20-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 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.