概述ASP.NET状态类型
创始人
2024-04-21 15:20:21
0

提供了四种ASP.NET状态类型:application,session,cookie,view。

Application状态为应用程序提供了一个全局的状态。所有客户都可以使用该状态。从设计的角度来说,我们通常用Application来存储一些标准的数据。同时,我们在使用它时要注意避免性能的降低,存储的数据尽可能提供给客户只读的功能。

我们可以使用HttpApplication类的Application属性来访问Application状态,它返回一个 HttpApplicationState类的实例。这个类是一个对象集合,可以存储任何类型的数据,并以键/值对的形式存储。一旦数据被存储到状态后,就不会删除,除非应用程序重新启动或者被终止或回收。

我们可以在Global.asax的Application_Start函数中存储数据:

  1. void Application_Start(object src, EventArgs e)  
  2. {  
  3. int exp = 0;  
  4. // population of dataset from ADO.NET query not shown  
  5. // Cache DataSet reference  
  6. Application["Experiment"] = exp;  
  7. }  
  8. 现在你可以在任意页面下使用它:  
  9. private void Page_Load(object src, EventArgs e)  
  10. {  
  11. int expr = Int32.Parse((Application["Experiment"]));  

于Application状态对于所有客户都是共享的,如果客户只是读取该数据,则没有什么问题,一旦要进行写操作,就不能保证线程的安全以及出现同步争用的问题。我们可以使用HttpApplicationStateLock类,它派生于ReadWriteObjectLock类,它提供了读/写锁的两种属性。在ASP.NET下,隐式地调用了AcquireWrite()和AcquireRead()方法以保证避免上面的问题。当然,我们也可以显示地使用Lock()和Unlock():

  1. private void Page_Load(object sender, System.EventArgs e)  
  2. {  
  3. Application.Lock();  
  4. int expr = Int32.Parse((Application["Experiment"]));  
  5. if (expr>=something)  
  6. {  
  7. //do something  
  8.  }  
  9. Else  
  10. {  
  11. //do something else  
  12.  }  
  13. Application.UnLock();  
  14. //Some other thing goes here  


session,cookie,view状态都是用来保存客户端信息的ASP.NET状态类型。它们之间又有什么区别呢?

Session状态是在客户登录的时候创建的,它保存了客户特定的信息,并以Session ID来标识。当一个新客户访问应用程序时,先生成一个新的Session ID(或是Session Key),并为同一个客户接下来的请求创建联系。你可以在Session State中存储任意类型的数据,作为你的应用,状态被同一个进程和AppDomain(App域)维护。Session State的特点是为每一个特定的客户创建状态以维护客户的信息,这些状态信息存储在服务器端的默认的会话状态配置中。

  1. Session(“Value”) = expr ; // Storing the data into session object  
  2. SomeFunction()  
  3. {  
  4. int expr = Int32.Parse(Session(“Value”));//Accessing from it  
  5.  if (expr>=something)  
  6. {  
  7. //do something  
  8.  }  
  9. Else  
  10. {  
  11. //do something else  
  12.  }  
  13. //Some other thing goes here  

既然Session State针对特定的客户建立,通过它来识别客户的请求。ASP.NET提供了一种加密机制和编码算法生成自己的Session Key。这是非常必要的,因为知道了你的Session Key,就有权限访问指定的页面了。

在ASP.NET中生成Session Key的方法:

  1. byte[] sessionkey = new byte[15];  
  2. //Generates a random number  
  3. RNGCryptoServiceProvider rngkey = new RNGCryptoServiceProvider ();  
  4. rngkey.GetBytes (sessionkey);  
  5. string clientsessionKey = SessionId.Encode (sessionkey); 


但是Session和客户端的Cookie是有关的,当客户关掉Cookie时,Session就失效了。不过在ASP.NET中可以在web.config中修改设置,使Session的传递脱离Cookie。方法是:

  1.  
  2.  
  3.  cookieless="true" /> 
  4.  
  5.  

对于Cookie大家并不陌生,每个Cookie存储了多个名/值对,我们可以通过HttpCookie类的值集合来访问它,也可以间接地通过类所提供的索引器访问。Cookie在ASP.NET下的使用:

  1. protected void Page_Load(Object sender, EventArgs E)  
  2. {  
  3. int expr = 0;  
  4. if (Request.Cookies["Expr"] == null)  
  5. {  
  6. // "Expr" cookie not set, set with this response  
  7.   HttpCookie cokExpr = new HttpCookie("Expr");  
  8. cokExpr.Value = exprTextBox.Text;  
  9. Response.Cookies.Add(cokExpr);  
  10. expr = Convert.ToInt32(exprTextBox.Text);  
  11. }  
  12. else  
  13. {  
  14. // use existing cookie value...  
  15.   expr = Convert.ToInt32(Request.Cookies["Expr"].Value);  
  16. }  
  17. // use expr to customize page  

由于Cookie存储的信息是放到客户端的,用户在访问服务器端页面时,必然在客户端和服务器端之间频繁交换信息,影响了程序的性能。而Session由于存储在服务器内存中,因此不存在这个问题。不过,Session存储的信息是临时的,用户一旦关闭浏览器,状态即失去,而Cookie则相反。以上介绍ASP.NET状态类型

【编辑推荐】

  1. ASP.NET调用WCF服务
  2. 浅析ASP.NET验证控件
  3. ASP.NET中WCF服务与ASMX服务的兼容性
  4. 详解ASP.NET应用程序
  5. ASP.NET的HttpModule

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...