zoukankan      html  css  js  c++  java
  • asp net中的状态管理的方式有哪几种分别有哪些优势和缺点

    asp net中的状态管理的方式有哪几种分别有哪些优势和缺点

    2010年03月26日

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

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

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

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

      void Application_Start(object src, EventArgs e) 

      { 

      int exp = 0; 

      // population of dataset from ADO.NET query not shown 

      // Cache DataSet reference 

      Application["Experiment"] = exp; 

      } 

      现在你可以在任意页面下使用它: 

      private void Page_Load(object src, EventArgs e) 

      { 

      int expr = Int32.Parse((Application["Experiment"])); 

      } 

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

      private void Page_Load(object sender, System.EventArgs e) 

      { 

      Application.Lock(); 

      int expr = Int32.Parse((Application["Experiment"])); 

      if (expr>=something) 

      { 

      //do something 

      } 

      Else 

      { 

      //do something else 

      } 

      Application.UnLock(); 

      //Some other thing goes here 

      } 

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

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

      Session("Value") = expr ; // Storing the data into session object 

      SomeFunction() 

      { 

      int expr = Int32.Parse(Session("Value"));//Accessing from it 

      if (expr>=something) 

      { 

      //do something 

      } 

      Else 

      { 

      //do something else 

      } 

      //Some other thing goes here 

      } 

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

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

      byte[] sessionkey = new byte[15]; 

      //Generates a random number 

      RNGCryptoServiceProvider rngkey = new RNGCryptoServiceProvider (); 

      rngkey.GetBytes (sessionkey); 

      string clientsessionKey = SessionId.Encode (sessionkey); 

      但是Session和客户端的Cookie是有关的,当客户关掉Cookie时,Session就失效了。不过在ASP.Net 

      中可以在web.config中修改设置,使Session的传递脱离Cookie。方法是: 

      <configuration> 

      <system.web> 

      <sessionState cookieless="true" /> 

      </system.web> 

      </configuration> 

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

      protected void Page_Load(Object sender, EventArgs E) 

      { 

      int expr = 0; 

      if (Request.Cookies["Expr"] == null) 

      { 

      // "Expr" cookie not set, set with this response 

      HttpCookie cokExpr = new HttpCookie("Expr"); 

      cokExpr.Value = exprTextBox.Text; 

      Response.Cookies.Add(cokExpr); 

      expr = Convert.ToInt32(exprTextBox.Text); 

      } 

      else 

      { 

      // use existing cookie value... 

      expr = Convert.ToInt32(Request.Cookies["Expr"].Value); 

      } 

      // use expr to customize page 

      } 

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

      至于View State,主要是指控件和页面的状态信息,它以_VIEWSTATE值传递给服务器端。有爱好的可以看我另外一篇文章:ASP.Net中控件的EnableViewState属性 

      Application、Session和Cookie,可以借用Carfield的总结: 

      COOKIE 是本地文件,是 40 大盗在阿里巴巴家做的记号,或者是送牛奶的人在你家门口钉的箱子。 

      SESSION 是服务器端内存,是你洗澡时浴池发给你的钥匙。自己专用,可以开自己的好多箱子。 

      APPLICATION 是公共浴池。在这里能看见所有人,包括 ppmm 哦:)。 

  • 相关阅读:
    201871010113-刘兴瑞 实验二 个人项目—《背包问题》项目报告
    201871010113-刘兴瑞 实验一 软件工程准备—初识软件工程
    201871010113-刘兴瑞《面向对象程序设计(java)》课程学习总结
    201871010113-刘兴瑞《面向对象程序设计(java)》第十七周学习总结
    201871010113-刘兴瑞《面向对象程序设计(java)》第十六周学习总结
    201871010113-刘兴瑞《面向对象程序设计(java)》第十五周学习总结
    201871010113-刘兴瑞《面向对象程序设计(java)》第十四周学习总结
    201871010113-刘兴瑞《面向对象程序设计(java)》第十三周学习总结
    《2019面向对象程序设计(java)课程学习进度条》
    201871010114-李岩松 实验四 团队作业1:软件研发团队组建(个人博客)
  • 原文地址:https://www.cnblogs.com/invinboy/p/2068219.html
Copyright © 2011-2022 走看看