页面状态机制的具体实现原理
上次我们讲到了 Asp.net 提供了一系列的维持页面状态的机制,有 Session, Cookie, ViewState , Application , Cache , HiddenField 等。这次我来讨论一下一些机制是如何实现的。
- Session 。 Session 的实现是依赖于 SessionID 的,每次 client 端访问 server 端的时候,服务器都会给 client 分配一个 SessionID ,下次 client 再次访问的时候,在 Request 里面把这个 SessionID 一起提交给 Server , Server 就能根据 Request 里面的 SessionID 来找到在 Server 端所储存的数据了。那么现在的问题就是这个 SessionID 在 client 端被放在哪里了呢?答案就是 Cookie 中,但是如果 client 端禁用了 Cookie ,那这个 SessionID 又该怎么办呢?哈哈,还可以通过 QueryString 来传递。所以 Session 机制的实现是依赖于 Cookie 和 QueryString 的。
- ViewState 。前文提到,在 ViewState 中存放的对象必须是可以序列化的对象,这是和它的实现机制有很大关联的。序列化可以把内存中的对象转变为 string ,还可以根据 string 转变回内存中的对象,这种机制是方便了我们进行对象的持久化。 Asp.net 把放入 ViewState 中的对象作为一个整体序列化成为一个 HiddenField 中 string 的 Value 。 HiddenField 前文已经提到了,是一个页面的隐藏域,每次 Postback 之后,这个 HiddenField 中的 value 就会被传回并被反序列化为 ViewState 。所以 ViewState 的实现就是依赖于 HiddenField ,你可以看见每个页面再 Render 到 client 端的时候都会带有一个这样的 HiddenField, <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="XXX"/> 。看,这就是在 Client 端的 ViewState 了,不过由于是序列化过的,我也不知道里面是什么了。所以 ViewState 是不能在 Client 端进行操作的,不过普通的 HiddenField 就可以哦
- 其他的页面状态实现的机制就比较简单。 Cookie 是在 Client 端以文件方式存储的。 Application 和 Cache 是在 server 端内存中存储。 QueryString 是在 Url 里面存储。 HiddenField 是以 Html 元素存储。
希望了解了这些机制以后,能使你更清楚地了解什么时候该使用哪种机制来存储页面的状态。