Managing Application State

Managing Application State


Using Application State

This sample illustrates the use of application state to read a dataset in Application_Start.

 

VB Application2.aspx

[ Run Sample] | [ View Source]
LateBreaking Samples:

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.

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.

<script language="JavaScript" type="text/javascript"> function doClick(index, numTabs, id) { document.all("tab" + id, index).className = "tab"; for (var i=1; i < numTabs; i++) { document.all("tab" + id, (index + i) % numTabs).className = "backtab"; } document.all("code" + id, index).style.display = ""; for (var j=1; j < numTabs; j++) { document.all("code" + id, (index + j) % numTabs).style.display = "none"; } } </script>

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;
}
C# VB JScript  

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

void Page_Load(Object sender, EventArgs e) {
    DataView Source = (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.

Using Session State

The following sample illustrates the use of session state to store volatile user preferences.

 
VB Session1.aspx

[ Run Sample] | [ View Source]
LateBreaking Samples:

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.

void Session_Start() {
    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.

protected void Submit_Click(Object sender, EventArgs e) {
    Session["BackColor"] = BackColor.Value;
    ...

    Response.Redirect(State["Referer"].ToString());
}
C# VB JScript  

The individual values are retrieved using the GetStyle method:

protected String GetStyle(String key) {
    return Session[key].ToString();
}
C# VB JScript  

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

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.

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:

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:

By default, ASP.NET will store the session state in the same process that processes the request, just as ASP does. Additionally, ASP.NET can store session data in an external process, which can even reside on another machine. To enable this feature:

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):
<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.

Using Client-Side Cookies

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

 
VB Cookies1.aspx

[ Run Sample] | [ View Source]
LateBreaking Samples:

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);
    }
}
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 "";
}
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]
LateBreaking Samples:

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());
}
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]
LateBreaking Samples:

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

Using Session State

The following sample illustrates the use of session state to store volatile user preferences.

 

VB Session1.aspx

[ Run Sample] | [ View Source]
LateBreaking Samples:

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.

void Session_Start() {
    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.

protected void Submit_Click(Object sender, EventArgs e) {
    Session["BackColor"] = BackColor.Value;
    ...

    Response.Redirect(State["Referer"].ToString());
}
C# VB JScript  

The individual values are retrieved using the GetStyle method:

protected String GetStyle(String key) {
    return Session[key].ToString();
}
C# VB JScript  

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

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

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:

    &amp;amp;lt;sessionState timeout=&amp;amp;quot;40&amp;amp;quot; /&amp;amp;gt; 
  

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:

    &amp;amp;lt;sessionState cookieless=&amp;amp;quot;true&amp;amp;quot; /&amp;amp;gt; 
  

By default, ASP.NET will store the session state in the same process that processes the request, just as ASP does. Additionally, ASP.NET can store session data in an external process, which can even reside on another machine. To enable this feature:

  • 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/CurrentControlSet/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.
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):
<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.

Using Client-Side Cookies

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

 
VB Cookies1.aspx

[ Run Sample] | [ View Source]
LateBreaking Samples:

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);
    }
}
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 "";
}
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]
LateBreaking Samples:

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());
}
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]
LateBreaking Samples:

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

Using Client-Side Cookies

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

 

VB Cookies1.aspx

[ Run Sample] | [ View Source]
LateBreaking Samples:

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);
    }
}
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 "";
}
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]
LateBreaking Samples:

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());
}
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]
LateBreaking Samples:

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

Using ViewState

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

 

VB PageState1.aspx

[ Run Sample] | [ View Source]
LateBreaking Samples:

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();
    ...
}
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
Section Summary
  1. Use application state variables to store data that is modified infrequently but used often.
  2. 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.
  3. 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.
  4. 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.
  5. Store small amounts of request-specific data in the view state. The data is sent from the server to the client and back.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值