Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Krizsán Zoltán ver 1.1. 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.

Hasonló előadás


Az előadások a következő témára: "Krizsán Zoltán ver 1.1. 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."— Előadás másolata:

1 Krizsán Zoltán ver 1.1

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

3 ké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 3

4 4

5 5

6 1. Page request : újra kell e fordítani, vagy mehet cache-ből 2. Start : Request, Response, IsPostBack tulajdonságok beállítása 3. Initialization : mester oldal, és téma hozzárendelés 4. Load : viewstate-ből az adatok a vezérlőkbe 5. 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. 6

7 Start szakasz után, de még az inicializálás előtt Haszná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 7

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

9 1. OnLoad oldal metódus  adatbázis kapcsolat létrehozása itt 2. OnLoad metódusa a vezérlőknek 3. Load eseménye az oldalnak 4. Load eseménye a vezérlőknek 5. Vezérlők eseménykezelői 6. LoadComplete 9

10 A megfelelő vezérlő, megfelelő eseménye kliens oldali aktivitás alapján. Érdemes használni az IsValid tulajdonságát az oldalnak. 10

11 1. PreRender esemény 2. PreRenderComplete esemény  DataBind() után 3. SaveStateComplete esemény 4. Render metódusa hívódik minden vezérlőnek  saját vezérlőnél ezt írjuk felül. 11

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

13 13

14 Page methodPage eventControl 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. 14

15 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

16 View state Control state Hidden fields Cookies Query strings 16

17 Nincs szerver oldali erőforrás szükséglete Egyszerű használat Biztonsá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

18 Nincs 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

19 Nincs 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

20 Nincs szerver oldali erőforrás szükséglete. Konfigurálható érvényesség. Egyszerű: kulcs – érték pár Méret korlát (4096, mostanában 8192) Letiltható a kliensben. Biztonsági kockázat. Érték csak szöveg lehet. 20

21 Nincs 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

22 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

23 Tiltani lehet  elemenként,  egész oldalra,  konfigurációból: Öröklődik az EnableViewState (inherited) 23

24 [Serializable] public class Customer { public string FirstName; public string LastName; public Customer(string firstName, string lastName) { FirstName = firstName; LastName = lastName; } 24

25 Customer cust = new Customer(”név",”név2"); ViewState["CurrentCustomer"] = cust; cust = (Customer)ViewState["CurrentCustomer"]; 25

26 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

27 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

28 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

29 aCookie.Expires = DateTime.Now.AddDays(- 1); aCookie.Values.Remove(subkeyName); 29

30 Olvasás Request.QueryString["Name"]; vagy Request.QueryString[0]; Írás Response.Redirect("WebForm2.Aspx?" + "Name=" + Server.UrlEncode(this.txtName.Text) + "&LastName=" + Server.UrlEncode(this.txtLastName.Text)); 30

31 Application state Session state Profile properties Database support (külön diasorozat) 31

32 Egyszerű használat. Alkalmazás – globális hatókör. Elveszhet, ha a szerver kisöpri a webapp-ot. Szerver memóriában van. 32

33 Egyszerű 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

34 Felhaszná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ényel Gondoskodni kell felszabadításról. 34

35 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

36 36

37 37

38 Menté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

39 MS SQL | SQL Express adatbázis aspnet_regsql.exe futtatása (legalább –A p) Táblában tárol: aspnet_Profile alapértelmezetten csak authentikált felhasználónak Írás: Context.Profile["cim"] = "Hello"; Olvasás: Label1.Text = (String) Context.Profile["cim"]; 39

40 Konfigurációban szerepeltetni kell: Ezután használható: Context.Profile[”cím”] = "Hello"; Feladat: 40

41 Í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

42 Alkalmazá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 cache  Az oldal kimenetét tárolja, amit nem kell generálni. 42

43 Objektumokat 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

44 Sliding expiration (csúszó lejáratú) Miután elérték az elemet meddig maradjon még bent. Absolute expiration Pontosan meddig maradjon bent (használattól függetlenül). 44

45 Megadhatunk 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

46 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

47 Kiolvasás cachedString = (string)Cache["CacheItem"]; Törlés Cache.Remove("MyData1"); 47

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

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

50 Ha ne a ViewState-el oldjuk meg a feladatot, akkor tiltsuk le a támogatás false -> EnableViewState Bö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”] 50

51 true -> EnableViewState eseménykezelőben megfelelő művelet. 51

52 Standard – HiddenField – Value tulajdonság (esetleg value changer) HTML – Input (Hidden) runat=”server” – Value tulajdonság Beolvasás a használat előtt  figyelni, hogy első alkalom e! (IsPostback true) Kiírni a Render előtt! 52

53 Olvasni 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

Google Hirdetések