ASP.NET 4.0 Állapot menedzsment, oldal életciklus

Post on 04-Jan-2016

29 views 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 of ASP.NET 4.0 Állapot menedzsment, oldal életciklus

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