[Asp.Net]状态管理(Session、Application、Cache、Cookie 、Viewstate、隐藏域 、查询字符串)-阿里云开发者社区

开发者社区> 杰克.陈> 正文

[Asp.Net]状态管理(Session、Application、Cache、Cookie 、Viewstate、隐藏域 、查询字符串)

简介: 原文:[Asp.Net]状态管理(Session、Application、Cache、Cookie 、Viewstate、隐藏域 、查询字符串) Session:  1. 客户在服务器上第一次打开Asp.Net页面时,会话就开始了。
+关注继续查看
原文:[Asp.Net]状态管理(Session、Application、Cache、Cookie 、Viewstate、隐藏域 、查询字符串)

  1. Session: 
    1. 客户在服务器上第一次打开Asp.Net页面时,会话就开始了。当客户在20分钟之内没有访问服务器,会话结束,销毁session。(当然也可以在Web.config中设置缓存时间)可以在Global.aspx的Session_Start()事件处理程序中,可以初始化会话变量。在下面的实例中,名为mydata的会话状态被初始化为0:

 

 

运行结果:

 

2.Session是保存在服务器端的用户变量。我可以在一个页面中对Session进行值,然后在另一个页面里访问它。

Session的附值方法如下:

2.Application

 

解释:如果数据应在多个客户端共享,就可以使用应用程序状态来保存。应用程序状态的使用方式跟Session非常相似。对于应用程序状态,应使用HttpApplication类,通过Page类的Application属性就可以访问它。

通常Application可以用来统计访问网站的人数,在启动Web应用程序时,初始化应用程序变量userCount。 Application_Start()是global.asax文件中的时间处理程序方法,在启动网站的第一个Asp.Net页面时调用该方法。

 在Application_Start()事件处理程序中,应用程序变量userCount的值会递增。在改变应用程序变量之前,应用程序对象必须用Lock() 方法锁定,否则会出现线程问题,因为多个用户可以同时访问一个应用程序变量。在改变了应用程序变量的值后,还必须调用Unlock()方法。注意锁定和解 锁时间的时间比较短,在此时间段内,不应读文件或数据库中的数据。否则,其他用户就必须等到数据访问完成之后才能操作。

运行结果:

注意:不要在应用程序状态中存储太多的数据,因为应用程序状态需要服务器资源,直到服务器停止或重启之后,才会释放这些资源。

 3.Cache

 使用Cache类的优点是当缓存的数据发生变化时,Cache类会让数据失效,并实现缓存数据的重新添加,然后通知应用程序,报告缓存的及时更新。

   1.常用的方法

   创建cache  
  在DotNet环境下通过Cache.Insert(string key,object o)方法创建。
      其中key 代表cache的ID,o代表存到cache里的对象。
 Add: 将数据添加到Cache对象
  Insert: 向Cache中插入数据项,可用于修改已经存在的数据缓存项
   销毁cache 
  通过方法Cache.Remove(string key)
      其中key 代表cache的 ID.
   调用cache  
  Cache支持装箱/拆箱操作。如你可以把一个DataSet对象ds通过Cache.Insert(“dsCache”,ds)的方式存到Cache中,可以通过拆箱操作 DataSet ds = (DataSet)Cache[“dsCache”]来访问它。
      获取数据
 Get:从Cache对象中获取指定的数据项,注意返回的是Object类型,需要进行类型转换
 GetType:从Cache对象中获取数据项的类型,判断数据类型后,方便进行转换
GetEnumerator
 循环访问Cache对象中的缓存数据项。注意其返回类型是“IDictionaryEnumerator”
下面的代码演示了如何应用Cache类的这些方法。在使用本代码时需要注意,代码中使用了Arraylist对象,所以需要添加对命名空间“System.Collections”的引用,同时使用Cache类别忘记了添加命名空间

技巧:在使用GetType方法时,如果要判断类型,需要使用Object.GetType().Name属性获取类型的名称。

 

运行结果:

其中在读取类型为ArrayList的数据时,由于没有进行类型转换,所以取出的是类型为“System.Collections.ArrayList”的对象。

2.什么时候用cache  
  Cache 一般用于数据较固定,用的较频繁的地方。例如可以把进销存系统中可以把产品信息存入cache,在用户调用产品信息时通过调用cache即可,这样从很大 程度上减少了用户与数据库的交互,提高了系统的性能。反之,cache不适合用在数据变动快,使用范围很窄的地方。例如把一个具体采购单存入 cache中。
   3.cache 调用注意事项  
  Cache是有时间限制的。超过了服务器设置的过期时间,就会被服务器回收。当cache被回收后对应的内存块就会被清空,再次通过cache[“cachekey”]访问对象时返回的就是null值。所以以下这种调用就会出现异常
  4.缓存功能

典型应用:实现数据的缓存快速读取功能

本例的目的是将目录列表填充到下拉框中,当缓存失效后,目录列表的内容为空。演示的步骤如下所述。

在5秒以内如果单击按钮,则正常显示目录列表,如果超过5秒,则缓存对象已经不存在,所以下拉列表框的内容为空。

4. Viewstate

一、ViewState的原理

1.浏览器请求Default.aspx页面
2.在服务器端 发现创建的ViewState 这个时候 会自动创建一个名字叫做__VIEWSTATE(双下滑线 全部是大写)的隐藏域 其隐藏域的值经过base64加密以后返回到浏览器端这一加密过程在页面生命周期的SaveState事件中的SaveAllState方法中完成

3.当浏览器提交表单的时候 将__VIEWSTATE的隐藏域也一起提交到服务端 这个时候 页面生命周期的ReadState事件
的ReadAllState方法会将加密后的值反base64解密 最后将值赋值给名字叫做name的ViewState
4.最后来操作ViewState中的值

二、ViewState的用法:

1.定义ViewState属性

public int PageCount{

get{return (int)ViewState["PageCount"];}

set{ViewState["PageCount"]=value;}

}

2.使用ViewState的条件

如果要使用ViewState,则在ASPX页面中必须要有一个服务器端窗体标记(<form runat = "server">)。窗体字段是必须的,这样包含ViewState信息的隐藏字段才能被传回服务器。而且,该窗体还必须是服务器端的窗体,这样 在服务器上执行该页面时,ASP.net页面框架才能添加隐藏字段。

page的EnableViewState 属性值为true

控件的EnableViewState 属性值为 true

四、viewstate与session的对比

  (1) session值是保存在服务器内存上,那么,可以肯定,大量的使用session将导致服务器负担加重. 而viewstate由于只是将数据存入到页面隐藏控件里,不再占用服务器资源,因此, 我们可以将一些需要服务器"记住"的变量和对象保存到viewstate里面. 而session则只应该应用在需要跨页面且与每个访问用户相关的变量和对象存储上.

(2) session在默认情况下20分钟就过期,而viewstate则永远不会过期.

但viewstate并不是能存储所有的.net类型数据,它仅仅支持String、Integer、Boolean、Array、ArrayList、Hashtable 以及自定义的一些类型.

任何事物都有两面性, 使用viewstate会增加页面html的输出量,占用更多的带宽,这一点是需要我们慎重考虑的. 另外, 由于所有的viewstate都是存储在一个隐藏域里面,用户可以很容易的通过查看源码来看到这个经过base64编码的值.然后再经过转换就可以获取你 存储其中的对象和变量值

5. Cookie
用于保存客户浏览器请求服务器页面的请求信息,其有效期可以人为设置,而且其存储的数据量很受限制,因此不要保存数据集及其他大量数据。而且Cookie以明文方式将数据信息保存在客户端的计算机中,因此最好不要保存敏感的未加密的数据。

以下是cookie的几种方法:

6.隐藏域


隐藏域是网页里面一个特殊的空间,它不在网页中显示出来,主要用途是为网页交互时存储一些不需要在网页显示的数据
隐藏域是用来收集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的。当表单被提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上。
例如:<input type="hidden" name="ExPws" value="dd">
其实说白了就隐藏域不在前台显视的,跟表单的元素一样.有名字有数值,只是在提交数据是不可见的.

例子:在ASP中隐藏域可以用于隐藏的表单,这样输入框就可以不受表单的限制可以随意在网页上布局
<input name="id" type="hidden" value="abc">
<%="隐藏域值为:"& request("id")%>

提交此表单后会显示

隐藏域值为:abc

 7.查询字符串

当服务器执行到Response.Redirect语句时,会立即中断页面的生命周期,直接向客户端返回信息,让客户端进行重定向操作。

ASP.NET中,服务器端重定向有三种方法

1.Server.Transfer("xxx.aspx"):

服务器停止解析本页,保存此页转向前的数据后,再使页面转向到newPage.aspx, 并将转向前数据加上newPage.aspx页结果返回给浏览器。

2.Server.Execute("xxx.aspx");

服务器保存此页转向前的数据后,使页面转向到newPage.aspx执行, 再返回本页继续执行.再将三者结果合并后返回给浏览器.

3.Response.Redirect("xxx.aspx"):

服务器执行到这个方法时,就发信息告诉客户端浏览器,让客户端浏览器发出一个新的http请求,该请求的url为"xxx.aspx"。浏览器于是通过全新的http请求而转到了xxx.aspx页面。

总结:

1.用户变量的存储:session比较常用

2.页面跳转:查询字符串比较常用

3.缓存

l  cookie(用于保存客户浏览器请求服务器页面的请求信息,其有效期可以人为设置,而且其存储的数据量很受限制)

l  cache(用于数据缓存更新)

l  viewstate(存储在一个隐藏域里面, 不占用服务资源,永远不会过期但会增加html输出量,占用带宽)

l  application(应用于整个应用程序,相当于全局变量,但是用处不是很广泛,可以用于统计人数)

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java State Pattern(状态模式)
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。
799 0
fastjson解析json字符串,key缺少双引号导致下游服务无法解析
背景说明 在使用fastjson 1.2.60版本将对象转化为json字符串时,为处理Map值为null的情况,采用了WRITE_MAP_NULL_FEATURES属性,但该属性解析出来的key中缺少双引号,在key包含特殊字符时,如“-”和“:",下游服务在进行反序列化时出现无法解析的错误,从而出现问题。
2824 0
[UML]UML系列——状态机图statechart diagram
原文:[UML]UML系列——状态机图statechart diagram 系列文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include、extend) [UML]UML系列——类图Class [UML]UML系列——类图class的关...
960 0
4.mysql数据库创建,表创建模等模板脚本,mysql_SQL99标准的连接查询(内连接,外连接,满外连接,交叉连接)
 mysql数据库创建,表创建模等模板脚本 -- 用root用户登录系统,执行脚本   -- 创建数据库 create database mydb61 character set utf8 ;   -- 选择数据库 use mydb61;   -- 增加 dbuser1 用户
1363 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6883 0
MySQL表连接(内连接、交叉连接、外连接、联合查询)
MySQL表连接(内连接、交叉连接、外连接、联合查询) 一、内连接(INNER JOIN)    SELECT * FROM 表1 INNER JOIN 表2   ON   条件    SELECT * FROM 表1 INNER JOIN 表2   WHERE  条件    典型的联接运算,使用像 =  或 之类的比较运算符)。
3699 0
Elasticsearch的TermsQuery慢查询分析和优化
前言 本篇文章主要记录业务上的一个TermsQuery优化和分析的过程和一些思考。 在使用ES的时候,经常会遇到慢查询,这时候可以利用profile进行分析,当利用profile也查看不出什么端倪时候,可以尝试通过阅读代码查看查询为什么这么慢。如下是一个我们内部业务的一个慢查询,经常出现4s左右的延时,一模一样的查询,但是延时不一样,且很难复现。 { "from": 0,
554 0
+关注
杰克.陈
一个安静的程序猿~
9798
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载