分享
 
 
 

Managing Application State

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Managing Application State

Using Application State

Using Session State

Using Client-Side Cookies

Using ViewState

Section Summary

Using Application State This sample illustrates the use of application state to read a dataset in Application_Start.这个例子说明了在Application_Start中用application state读取数据。

VB Application2.aspx

[Run Sample] | [View Source]

Because an application and all the objects it stores can be concurrently accessed by different threads, it is better to store only infrequently modified data with application scope. Ideally an object is initialized in the Application_Start event and further access is read-only.

因为程序和它的所有对象能被不同的线程并发的访问,最好用application scope保存唯一的很少被修改的数据。理想状态下是在Application_Start事件中对象已经被初始化并且设为只读访问。

In the following sample a file is read in Application_Start (defined in the Global.asax file) and the content is stored in a DataView object in the application state.

下面的例子是在Application_Start事件里读取一个文件(在Global.asax里定义)并且把DataView对象的内容存储在application state。

void Application_Start() {

DataSet ds = new DataSet();

FileStream fs = new FileStream(Server.MapPath("schemadata.xml"),FileMode.Open,FileAccess.Read);

StreamReader reader = new StreamReader(fs);

ds.ReadXml(reader);

fs.Close();

DataView view = new DataView(ds.Tables[0]);

Application["Source"] = view;

}

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

function Application_Start() : void {

var ds:DataSet = new DataSet();

var fs:FileStream = new FileStream(Server.MapPath("schemadata.xml"),FileMode.Open,FileAccess.Read);

var reader:StreamReader = new StreamReader(fs);

ds.ReadXml(reader);

fs.Close();

var view:DataView = new DataView(ds.Tables[0]);

Application("Source") = view;

}

C#

VB

JScript

In the Page_Load method, the DataView is then retrieved and used to populate a DataGrid object:

在Page_Load方法,DataView被使用并用于绑定DataGrid对象。

void Page_Load(Object sender, EventArgs e) {

DataView Source = (DataView)(Application["Source"]);

...

MyDataGrid.DataSource = Source;

...

}

Sub Page_Load(sender As Object, e As EventArgs)

Dim Source As New DataView = CType(Application("Source"), DataView)

...

MyDataGrid.DataSource = Source

...

End Sub

function Page_Load(sender:Object, e:EventArgs) : void {

var Source:DataView = DataView((Application("Source")));

...

MyDataGrid.DataSource = Source;

...

}

C#

VB

JScript

The advantage of this solution is that only the first request pays the price of retrieving the data. All subsequent requests use the already existing DataView object. As the data is never modified after initialization, you do not have to make any provisions for serializing access.

这个解决方法的优势是只有第一次请求给予取得数据。所有后来的请求使用已经存在的DataView对象。因为数据在初始化后再也没被修改过,你必须要解决连续访问的供应问题。

Using Session State The following sample illustrates the use of session state to store volatile user preferences. 下列例程说明了使用session state存储用户参数。

VB Session1.aspx

[Run Sample] | [View Source]

To provide individual data for a user during a session, data can be stored with session scope. In the following sample, values for user preferences are initialized in the Session_Start event in the Global.asax file.

为用户在session期间提供个人数据,数据能被session scope存储,下列例子中在Global.asax文件的Session_Start事件初始化用户参数。

void Session_Start() {

Session["BackColor"] = "beige";

...

}

Sub Session_Start()

Session("BackColor") = "beige"

...

End Sub

function Session_Start() : void {

Session("BackColor") = "beige";

...

}

C#

VB

JScript

In the following customization page, values for user preferences are modified in the Submit_Click event handler according to user input.

下列定制页面中,在Submit_Click事件里依照用户输入来修改用户参数值。

protected void Submit_Click(Object sender, EventArgs e) {

Session["BackColor"] = BackColor.Value;

...

Response.Redirect(State["Referer"].ToString());

}

Protected Sub Submit_Click(sender As Object, e As EventArgs)

Session("BackColor") = BackColor.Value

...

Response.Redirect(State("Referer").ToString())

End Sub

protected function Submit_Click(sender:Object, e:EventArgs) : void {

Session("BackColor") = BackColor.Value;

...

Response.Redirect(State("Referer").ToString());

}

C#

VB

JScript

The individual values are retrieved using the GetStyle method:

用GetStyle方法取得个人数据。

protected String GetStyle(String key) {

return Session[key].ToString();

}

Protected GetStyle(key As String) As String

Return(Session(key).ToString())

End Sub

protected function GetStyle(key:String) : String {

return Session(key).ToString();

}

C#

VB

JScript

The GetStyle method is used to construct session-specific styles:

GetStyle通常用来构建特殊的风格。

<style>

body

{

font: <%=GetStyle("FontSize")%> <%=GetStyle("FontName")%>;

background-color: <%=GetStyle("BackColor")%>;

}

a

{

color: <%=GetStyle("LinkColor")%>

}

</style>

To verify that the values are really stored with session scope, open the sample page twice, then change one value in the first browser window and refresh the second one. The second window picks up the changes because both browser instances share a common Session object.

用session scope验证数据是否已经存在,打开两个页面,然后在第一个浏览器窗口改变一个值,并刷新第二个窗口。第二个窗口的内容也改变了因为两个浏览器实例共享一个公共的Session对象。

Configuring session state: Session state features can be configured via the <sessionState> section in a web.config file. To double the default timeout of 20 minutes, you can add the following to the web.config file of an application:

设置session state:Session state能由在web.config文件中<sessionState>部分设置。增加默认的超时时间(20分钟),你能添加下列各项到应用程序的web.config文件。

By default, ASP.NET will store the session state in the same process that processes the request, just as ASP does. If cookies are not available, a session can be tracked by adding a session identifier to the URL. This can be enabled by setting the following:

默认ASP.NET会在相同的处理请求过程中保存session state,正象ASP一样。如果cookies不能用,通过添加一个URL的session标识跟踪session。

ASP.NET can store session data in an external process, which can even reside on another machine. To enable this feature:

ASP.NET能在外部过程中存储session数据,甚至在其他的机器上。使用特点:

Start the ASP.NET state service, either using the Services snap-in or by executing "net start aspnet_state" on the command line. The state service will by default listen on port 42424. To change the port, modify the registry key for the service: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSte\Services\aspnet_state\Parameters\Port

Set the mode attribute of the <sessionState> section to "StateServer".

Configure the stateConnectionString attribute with the values of the machine on which you started aspnet_state.

启动ASP.NET state 服务,使用Services snap-in或在命令行执行"net start aspnet_state"。state service会监听42424端口。可通过更改注册表中的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSte\Services\aspnet_state\Parameters\Port来改变端口。

设置<sessionState>部分的mode属性为"StateServer"。

用启动aspnet_state的机器地址来配置stateConnectionString的属性。The following sample assumes that the state service is running on the same machine as the Web server ("localhost") and uses the default port (42424):

下面的例子假设state service正在相同的机器上运行,象Web server(localhost)和使用默认端口(42424):

<sessionState

mode="StateServer"

stateConnectionString="tcpip=localhost:42424"

/>

Note that if you try the sample above with this setting, you can reset the Web server (enter iisreset on the command line) and the session state value will persist.

注意如果你想使用这个设置,你要重启WEB server(在命令行输入iisreset)并且session的值会保持。

Using Client-Side Cookies

The following sample illustrates the use of client-side cookies to store volatile user preferences.

下列例程说明了使用客户端的cookies来存储用户参数。

VB Cookies1.aspx

[Run Sample] | [View Source]

Storing cookies on the client is one of the methods that ASP.NET's session state uses to associate requests with sessions. Cookies can also be used directly to persist data between requests, but the data is then stored on the client and sent to the server with every request. Browsers place limits on the size of a cookie; therefore, only a maximum of 4096 bytes is guaranteed to be acceptable.

When the data is stored on the client, the Page_Load method in the file cookies1.aspx checks whether the client has sent a cookie. If not, a new cookie is created and initialized and stored on the client:

protected void Page_Load(Object sender, EventArgs e) {

if (Request.Cookies["preferences1"] == null) {

HttpCookie cookie = new HttpCookie("preferences1");

cookie.Values.Add("ForeColor", "black");

...

Response.AppendCookie(cookie);

}

}

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.AppendCookie(cookie)

End If

End Sub

protected function Page_Load(sender:Object, e:EventArgs) : void {

if (Request.Cookies("preferences1") == null) {

var cookie:HttpCookie = new HttpCookie("preferences1");

cookie.Values.Add("ForeColor", "black");

...

Response.AppendCookie(cookie);

}

}

C#

VB

JScript

On the same page, a GetStyle method is used again to provide the individual values stored in the cookie:

protected String GetStyle(String key) {

HttpCookie cookie = Request.Cookies["preferences1"];

if (cookie != null) {

switch (key)

{

case "ForeColor" : return cookie.Values["ForeColor"]; break;

...

}

}

return "";

}

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

protected function GetStyle(key:String) : String {

var cookie:HttpCookie = Request.Cookies("preferences1");

if (cookie != null) {

switch (key)

{

case "ForeColor" : return cookie.Values("ForeColor"); break;

...

}

}

return "";

}

C#

VB

JScript

Verify that the sample works by opening the cookies1.aspx page and modifying the preferences. Open the page in another window, it should pick up the new preferences. Close all browser windows and open the cookies1.aspx page again. This should delete the temporary cookie and restore the default preference values.

VB Cookies2.aspx

[Run Sample] | [View Source]

To make a cookie persistent between sessions, the Expires property on the HttpCookie class has to be set to a date in the future. The following code on the customization.aspx page is identical to the previous sample, with the exception of the assignment to Cookie.Expires:

protected void Submit_Click(Object sender, EventArgs e) {

HttpCookie cookie = new HttpCookie("preferences2");

cookie.Values.Add("ForeColor",ForeColor.Value);

...

cookie.Expires = DateTime.MaxValue; // Never Expires

Response.AppendCookie(cookie);

Response.Redirect(State["Referer"].ToString());

}

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.AppendCookie(cookie)

Response.Redirect(State("Referer").ToString())

End Sub

protected function Submit_Click(sender:Object, e:EventArgs) : void {

var cookie:HttpCookie = new HttpCookie("preferences2");

cookie.Values.Add("ForeColor",ForeColor.Value);

...

cookie.Expires = DateTime.MaxValue; // Never Expires

Response.AppendCookie(cookie);

Response.Redirect(State("Referer").ToString());

}

C#

VB

JScript

Verify that the sample is working by modifying a value, closing all browser windows, and opening cookies2.aspx again. The window should still show the customized value.

Using ViewState This sample illustrates the use of the ViewState property to store request-specific values.

VB PageState1.aspx

[Run Sample] | [View Source]

ASP.NET provides the server-side notion of a view state for each control. A control can save its internal state between requests using the ViewState property on an instance of the class StateBag. The StateBag class provides a dictionary-like interface to store objects associated with a string key.

The file pagestate1.aspx displays one visible panel and stores the index of it in the view state of the page with the key PanelIndex:

protected void Next_Click(Object sender, EventArgs e ) {

String PrevPanelId = "Panel" + ViewState["PanelIndex"].ToString();

ViewState["PanelIndex"] = (int)ViewState["PanelIndex"] + 1;

String PanelId = "Panel" + ViewState["PanelIndex"].ToString();

...

}

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

protected function Next_Click(sender:Object, e:EventArgs) : void {

var PrevPanelId:String = "Panel" + ViewState("PanelIndex").ToString();

ViewState("PanelIndex") = int(ViewState("PanelIndex") + 1);

var PanelId:String = "Panel" + ViewState("PanelIndex").ToString();

...

}

C#

VB

JScript

Note that if you open the page in several browser windows, each browser window will initially show the name panel. Each window can independently navigate between the panels.

Section Summary

Use application state variables to store data that is modified infrequently but used often.

Use session state variables to store data that is specific to one session or user. The data is stored entirely on the server. Use it for short-lived, bulky, or sensitive data.

Store small amounts of volatile data in a nonpersistent cookie. The data is stored on the client, sent to the server on each request, and expires when the client ends execution.

Store small amounts of non-volatile data in a persistent cookie. The data is stored on the client until it expires and is sent to the server on each request.

Store small amounts of request-specific data in the view state. The data is sent from the server to the client and back.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有