ASP.NET QuickStart Príručka
Riadenie stavu
Riadenie stavu je dôležitým aspektom každej aplikácie. Pretože informácie o stave sa strácajú
medzi následnými požiadavkami, ASP.NET poskytuje množstvo možností uchovať stav aj na strane servera aj na strane klienta, keď Vaša aplikácie alebo ovládací prvok potrebuje uchovanie informácie cez požiadavky. Táto sekcia ukazuje niektoré z dostupných funkcii riadenia stavu.
Využívanie aplikačného stavu
Táto ukážka načrtáva použite aplikačného stavu (application state) na prečítanie súboru dát
v Application_Start. Kolekcia HttpApplicationState použitá vyššie je primárne určená pre spätnú kompatibilitu s klasickým ASP a bude dôverne známa ASP vývojárom. Avšak používanie statických polí v ASP.NET je štandardne preferované cez použite HttpApplicationState.
VB Application State
Pretože k aplikácii a všetkým objektom, ktoré uchováva, môže byť súbežne pristupované
rôznymi vláknami, je lepšie uchovať iba občas modifikované údaje, ktoré sa týkajú aplikácie ako celku. V zásade je objekt spúšťaný udalosťou Application_Start a predošlý prístup je len na čítanie (read-only).
V nasledujúcej ukážke je súbor čítaný počas udalosti Application_Start (definovanej v súbore Global.asax) a obsah je uchovaný v objekte DataView v aplikačnom stave.
Sub Application_Start()
Dim ds As New DataSet()
Dim fs As New FileStream(Server.MapPath("schemadata.xml"),
FileMode.Open,FileAccess.Read)
Dim reader As New StreamReader(fs)
ds.ReadXml(reader)
fs.Close()
Dim view As New DataView (ds.Tables(0))
Application("Source") = view
End Sub
VB
V metóde Page_Load, je potom vyvolaný DataView a použitý na naplnenie objektu GridView:
Sub Page_Load(sender As Object, e As EventArgs)
Dim Source As New DataView = CType(Application("Source"), DataView)
...
MyGridView.DataSource = Source
...
End Sub
VB
Výhodou tohoto riešenia je, že iba prvá požiadavka platí za získanie dát. Všetky následné požiadavky používajú už existujúci DataView objekt.
Používanie Session State
Nasledujúca ukážka načrtáva používanie session state pre uchovanie nastavení užívateľa.
VB Session State
Pre poskytovanie individuálnych dát užívateľovi počas session, môžu byť údaje uchované, ktoré sa týkajú aktuálnej session (aktuálneho sedenia). V nasledujúcej ukážke sú hodnoty pre používateľské nastavenia spúšťané udalosťou Session_Start v súbore Global.asax .
Sub Session_Start()
Session("BackColor") = "beige"
...
End Sub
VB
Na nasledujúcej stránke sú hodnoty pre používateľské nastavenia modifikované v Submit_Click udalosti podľa vstupu používateľa.
Protected Sub Submit_Click(sender As Object, e As EventArgs)
Session("BackColor") = BackColor.Value
...
Response.Redirect(State("Referer").ToString())
End Sub
VB
Jednotlivé hodnoty sú vyvolávané použitím metódy GetStyle:
Protected GetStyle(key As String) As String
Return(Session(key).ToString())
End Sub
VB
Metóda GetStyle je použitá na vytvorenie štýlov špecifických pre session:
<style>
body
{
font: <%=GetStyle("FontSize")%> <%=GetStyle("FontName")%>;
background-color: <%=GetStyle("BackColor")%>;
}
a
{
color: <%=GetStyle("LinkColor")%>
}
</style>
Pre overenie, či sú hodnoty naozaj uchované v session,
si otvorte ukážku druhýkrát, potom zmeňte jednu hodnotu v prvom
okne prehliadača a obnovte druhé okno. Druhé okno
zozbieralo zmeny, pretože obidve inštancie prehliadača zdieľajú
spoločný objekt Session.
Konfigurovanie session state:
Funkcie Session state môžu byť konfigurované cez sekciu <sessionState>
v súbore web.config. Pre zdvojnásobenie prednastaveného časového limitu
20 minút, môžete pridať nasledovné do súboru web.config aplikácie:
<sessionState
timeout="40"
/>
Ak nie sú povolené cookies môže byť session identifikované pridaním session identifikátora do URL. To môže byť povolené nastavením nasledovného:
<sessionState
cookieless="true"
/>
Štandardne, ASP.NET uchová stav session v rovnakom procese, ktorý spracováva požiadavku, tak ako to robí ASP. Navyše môže ASP.NET uchovať dáta zo session v externom procese, ktorý môže dokonca sídliť na inom počítači. Pre povolenie tejto vlastnosti:
- Spustite ASP.NET state service, buď použitím Services snap-in alebo
vykonaním "net start aspnet_state" v príkazovom riadku. State service
bude štandardne načúvať na porte 42424. Pre zmenu portu, zmeňte
hodnotu v registroch (registry key) pre službu:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\Port
- Nastavte atribút mode sekcie <sessionState> na hodnotu "StateServer".
- Nakonfigurujte atribút stateConnectionString s hodnotami stroja
(machine), na ktorom ste spustili aspnet_state.
Nasledujúca ukážka predpokladá, že služba state service beží
na tom istom počítači ako webový server ("localhost") a používa
štandardný port (42424):
<sessionState
mode="StateServer"
stateConnectionString="tcpip=localhost:42424"
/>
Všimnite si, že ak vyskúšate s týmito nastavenia ukážku vyššie, môžete reštartnuť
webový server (vložte iisreset do príkazového riadka) a hodnota v session pretrvá.
Používanie cookies na strane klienta
Nasledujúca ukážka načrtáva použite cookies na strane klienta pre uchovanie užívateľských nastavení.
VB Cookies
Uchovávanie cookies u klienta je jednou z metód, ktoré metóda session state používa pre spojenie požiadaviek so sessions. Cookies môžu byť taktiež použité priamo pre zotrvanie dát počas požiadaviek, ale potom sú dáta uchované u klienta a odosielané na server s každou požiadavkou. Prehliadače ustanovujú limity na veľkosti cookies; Z tohto dôvodu je garantovanou maximálne prípustnou veľkosťou iba 4096 bajtov.
Keď sú dáta uchované u klienta, metóda Page_Load v súbore cookies1.aspx skontroluje, či užívateľ odoslal cookie. Ak nie, je vytvorené nové cookie a je spustené a uchované u klienta:
Protected Sub Page_Load(sender As Object, e As EventArgs)
If Request.Cookies("preferences1") = Null Then
Dim cookie As New HttpCookie("preferences1")
cookie.Values.Add("ForeColor", "black")
...
Response.Cookies.Add(cookie)
End If
End Sub
VB
Na tej istej stránke je opäť použitá metóda GetStyle pre poskytnutie jednotlivých hodnôt uchovaných v cookie:
Protected Function GetStyle(key As String) As String
Dim cookie As HttpCookie = Request.Cookies("preferences1")
If cookie <> Null Then
Select Case key
Case "ForeColor"
Return(cookie.Values("ForeColor"))
Case ...
End Select
End If
Return("")
End Function
VB
Otvorením a modifikovaním vlastností stránky cookies1.aspx skontrolujte, či ukážka funguje.
Otvorte stránku v ďalšom okne, mala by prevziať nové vlastnosti.
Zatvorte všetky okná prehliadača a opätovne otvorte stránku cookies1.aspx. Toto by malo vymazať dočasný cookie a obnoviť prednastavené hodnoty vlastností.
VB Cookies (trvalé)
Na vytvorenie trvalých cookie pomedzi session musí byť vlastnosť Expires v triede
HttpCookie nastavená na dátum v budúcnosti. Nasledujúci kód v stránke customization.aspx je identická ako predošlá ukážka, s výnimkou priradenia k Cookie.Expires:
Protected Sub Submit_Click(sender As Object, e As EventArgs)
Dim cookie As New HttpCookie("preferences2")
cookie.Values.Add("ForeColor",ForeColor.Value)
...
cookie.Expires = DateTime.MaxValue ' Never Expires
Response.Cookies.Add(cookie)
Response.Redirect(State("Referer").ToString())
End Sub
VB
Funkčnosť ukážky overte modifikovaním hodnoty, zatvorením všetkých okien prehliadača, a opätovným otvorením cookies2.aspx. Okno by stále malo ukazovať nastavenú hodnotu
Používanie View State
Táto ukážka načrtáva používanie vlastnosti ViewState pre uchovanie hodnôt špecifických pre požiadavku.
VB View State
ASP.NET poskytuje prístup zo strany servera na view state pre každý ovládací prvok. Ovládací prvok môže ukladať svoj vnútorný stav medzi požiadavkami použitím vlastnosti ViewState na inštanciu triedy StateBag. Trieda StateBag poskytuje rozhranie podobné slovníku pre uchovanie objektov priradeným ku kľúču.
Súbor pagestate1.aspx zobrazuje jeden viditeľný panel a uchováva jeho index vo View State stránky s kľúčom PanelIndex:
Protected Sub Next_Click(sender As Object, e As EventArgs)
Dim PrevPanelId As String = "Panel" + ViewState("PanelIndex").ToString()
ViewState("PanelIndex") = CType(ViewState("PanelIndex") + 1, Integer)
Dim PanelId As String = "Panel" + ViewState("PanelIndex").ToString()
...
End Sub
VB
Všimnite si, že keď otvoríte stránku vo viacerých oknách prehliadača, každé okno prehliadača
spočiatku ukáže panel s menami. Každé okno sa môže nezávisle pohybovať medzi panelmi.
|