2.6.3 实现Session State
Asp.net提供了简单接口来操作Session State,并可使用Web.Config进行简单设置,当配置文件中的设置改变时,能够在页面上立刻体现出来,而不需要重新启动asp.net进程。
以下代码演示了使用SQL Server来实现Session数据的存储和使用。
<sessionState mode="SQLServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1; Integrated Security=SSPI" cookieless="false" timeout="20" /> private void SaveSession(string CartID) { Session["ShoppingCartID"] = CartID; } private void CheckOut() { string CartID = (string)Session["ShoppingCartID"]; if(CartID != null) { // Transfer execution to payment page. Server.Transfer("Payment.aspx"); } else { // Display error message. } }
2.7使用Asp.net客户端缓存和状态
你还可以使用客户端存储页面信息的方式来降低服务器的负担,这种方法提供最低的安全保障,但却有最快的性能表现。由于需要将数据发送到客户端存储,所以数据量有限。
实现客户端缓存的机制有以下五种,接下来将依次介绍:
·隐藏栏位(Hidden Field)
·View State
·隐藏帧(Hidden Frame)
·Cookies
·Query String
这五种方式分别适合于存储不同类型的数据。
2.7.1 使用Hidden Field
你可以将经常改变的少量数据保存在HtmlInputHidden中来维护页面的状态。当每次页面回送的过程中,这些数据都会包含在表单中大送到服务器,所以你要使用HTTP POST方式来提交页面。
使用这种方式的优点如下:
不需要服务器资源,直接从页面中读取;
几乎所有的浏览器都支持;
实现简单;
由于数据在页面中,所以在web Farm的情况下也可使用。
缺点:
由于可以通过查看源码看到,所以可能会被篡改;
不支持复杂格式的数据,复杂数据必须使用解析字符串的方式来间接得到;
当存储大数据的时候会影响性能。
示例:
<input type="hidden" value="Initial Value" runat="server">
2.7.2 使用View State
所有的Web Form页面和控件都包含有一个ViewState属性,在对同一页面多次请求时可以保持页面内的值。它的内部实现是维护相应的hidden field,只不过是加密了的,所以比hidden field的安全性要好。
使用View State的性能表现很大程度上依赖于服务器控件的类型。一般来说,Label,TextBox,CheckBox,RadioButton,HyperLink的性能要好一些,而DropdownList,ListBox,DataGrid和DataList就要差很多,因为包含的数据量太大,所以每次页面回送都很耗时间。
有些情况下不推荐使用ViewState,比如:
1、不需要回送的页面避免使用;
2、避免使用ViewState保存大数据量;
3、在需要使用会话超时的情况下避免使用它,因为它没有超时操作。
ViewState的性能表现和Hidden Field的是类似的,但是具有更高的安全性。
优点:
数据在页面中自动维护,不需要服务器资源;
实现简单;
数据是经过加密和压缩的,比hidden field有更高的安全性;
数据存在客户端,可以在Web Farm情况下使用。
缺点:
存储大数据量时会降低性能;
和hidden field类似,在客户端数据仍然有潜在的安全威胁。
示例代码如下:
public class ViewStateSample : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { if (!Page.IsPostBack) { // Save some data in the ViewState property. this.ViewState["EnterTime"] = DateTime.Now.ToString(); this.ViewState["UserName"] = "John Smith"; this.ViewState["Country"] = "USA"; } } … private void btnRefresh_Click(object sender, System.EventArgs e) { // Get the saved data in the view state and display it. this.lblTime.Text = this.ViewState["EnterTime"].ToString(); this.lblUserName.Text = this.ViewState["UserName"].ToString(); this.lblCountry.Text = this.ViewState["Country"].ToString(); } }