终于两个星星了,散分,顺便讲解ViewState的实现!

timmy3310 2003-03-21 11:28:17
加精
昨天发了一篇,排版太烂,贴子也出了点莫名其妙的问题,所以重发一遍,斑竹别介意哦。
开始...

ViewState是.Net中提出的状态保存的一种新途径(实际上也是老瓶装新酒);我们知道,传统的Web程序保存状态的方式有这样几种:
1、Application 这是Web应用程序生命期中的全局保存区,保存在Application中的数据是全局有效的;在Asp.Net中,有一个应用程序池,其中保存了数个(或数十个)应用程序实例,每一次请求都会从池中取一个实例来处理请求,在请求完毕之前,这个实例不会接受其他请求;这就出现一个问题,同一时间可能存在多个应用程序,也就是多个线程,这些线程都存在访问Application的可能,所以在对Application中的对象进行处理的时候需要考虑线程同步的问题;实际上Application对象内部实现了一个线程锁,调用它本身的Add、Remove等方法的时候会自动调用加锁和解锁的操作,但是出于性能考虑,对于直接通过索引器或其他方式得到其中的对象并进行操作的过程,Application并没有自动处理线程同步,需要利用下列类似的代码来处理:
Application.Lock();
((int)Application["Count"])++;
Application.Unlock();
值得注意的是,调用了Lock之后,如果没有显示的调用Unlock,那么在这个请求结束的时候,Application对象会自动解锁,这样防止了造成死锁的问题,但是为了代码的健壮性,调用完Lock并且修改完毕应该立即的调用Unlock方法。
Application对象本质上就是一个Hash表,按照键值存放了对象,由于对象是全局并且存放在服务器,并且存在多线程同时访问,所以,Application里面存放的应该是访问较多,修改较少并且是全局至少大部分功能会使用的数据,例如计数器或者数据库连接串等。

2、Session 在Asp.Net内部,有一个StateApplication来管理Session,实际上就是一个辅助进程,处理Session到期、创建的特殊请求,在收到每一次请求的时候,辅助进程就会调用状态服务器(可以通过Web.config设置不同的状态服务器)来获取Session,如果没有对应该SessionId的Session,则会新建一个,然后绑定到上下文中(HttpContext);与Asp不同的是,Session的状态服务器有多种,目前在Asp.Net内部实现了三种:
1) InProcStateClientManager 这是传统的Session保存方式,但是还是有些细微差别
2) SqlStateClientManager 这是将Session保存到数据库方式
3) OutOfProcStateClientManager 这是将Session保存到进程外的方式
Asp.Net的Session机制有一个特点,就是处理Session的辅助进程与保存Session的状态服务器是分开的,按照MSDN的说法,有下列好处:
“因为用于会话状态的内存不在 ASP.NET 辅助进程中,所以可以实现从应用程序故障的恢复。”
“因为所有状态与辅助进程不存储在一起,您可以干净地跨多个进程对应用程序进行分区。这种分区可以显著地提高多个进程的计算机上应用程序的可用性和可缩放性。”
“因为所有状态与辅助进程不存储在一起,所以您可以跨运行于多个计算机上的多个辅助进程对应用程序进行分区。”
Asp.Net的Session机制个人观点,感觉灵活性比较好,内部实现也比较巧妙,但是实际上因为没有做过多的测试,所以应用上会不会像它说的那么美好,不敢打包票。有机会,我会单独写篇文章来深入的探讨Asp.Net 内部的Session机制。

3、Cookie 这个没甚么好说,实际上Asp.Net与Asp的Cookie没甚么分别,也许这项技术毁誉参半,而且比较依赖客户机实现,MS也没什么改进的。

4、ViewState 这是我们今天重点讨论的;实际上ViewState并不神秘,就是一个Hidden字段,但是它是服务器控件状态保存的基础;不熟悉的朋友可以用IE查看Html源码,找到一个名为"__VIEWSTATE"的Hidden字段,其中有一大堆乱七八糟的字符,这就是页面的ViewState。

做过Web程序的人可能都有这种痛苦的体会,有时候为了处理页面上面比较复杂的功能,常常会加很多Hidden,然后在服务器端用一大堆判断来分析目前的状态,写起来烦人,写完了代码更是难看;实际上,ViewState就是帮我们系统的实现了保存控件状态的功能,服务器端控件能够在多次请求间保存状态也全靠它。
...全文
154 169 打赏 收藏 转发到动态 举报
写回复
用AI写文章
169 条回复
切换为时间正序
请发表友善的回复…
发表回复
xd123 2003-04-15
  • 打赏
  • 举报
回复
up
zhxzyc 2003-04-15
  • 打赏
  • 举报
回复
还不结帖...UP
zhxzyc 2003-04-15
  • 打赏
  • 举报
回复
接分拉...
buaawjh 2003-04-13
  • 打赏
  • 举报
回复
up
require 2003-04-13
  • 打赏
  • 举报
回复
收藏
51946486 2003-04-13
  • 打赏
  • 举报
回复
大家争什么呀,这么多分,一个一个散多麻烦呀,我先帮大家收藏吧。呵呵!!
lylhyh 2003-04-13
  • 打赏
  • 举报
回复
up
吴所不及 2003-04-13
  • 打赏
  • 举报
回复
悟空,我叫你不要乱扔东西,万一200分砸到小孩怎么办啊。还是先放我这里吧!
luoyangture 2003-04-13
  • 打赏
  • 举报
回复
up
接分
itofly 2003-04-13
  • 打赏
  • 举报
回复
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
楼主英明!!!!!!!!!!!!!!!!!支持散分!!!!!!!!!!!!!!!!!!!
findawork 2003-04-13
  • 打赏
  • 举报
回复
请告诉我两个星星要多少分?
3个三角多少分?
4个三角多少分?
5个三角多少分?
1个星星多少分?
2个星星多少分?
3个星星多少分?
谢谢了!
findawork 2003-04-12
  • 打赏
  • 举报
回复
恭喜啊!升星
maltel 2003-04-12
  • 打赏
  • 举报
回复
gppd
uuuuu 2003-04-12
  • 打赏
  • 举报
回复
收藏
erictang2003 2003-04-12
  • 打赏
  • 举报
回复
收藏
jlhdlj 2003-04-09
  • 打赏
  • 举报
回复
谢谢楼主,收藏
chookrib 2003-04-09
  • 打赏
  • 举报
回复
gz
Meyer 2003-04-08
  • 打赏
  • 举报
回复
支持一下
等你下一篇文章
lightkkk 2003-04-08
  • 打赏
  • 举报
回复
up
fxmpch 2003-04-08
  • 打赏
  • 举报
回复
收藏,学习、
up
加载更多回复(149)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧