跟踪网站日志的时候发现了这个异常,如下是异常的详细信息:

错误信息:The client disconnected.   2009-4-6 19:35:41

at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError)
at System.Web.UI.HiddenFieldPageStatePersister.Load()
at System.Web.UI.Page.LoadPageStateFromPersistenceMedium()
at SpringStudio.Naming.Website.PageBase.LoadPageStateFromPersistenceMedium()
at System.Web.UI.Page.LoadAllState()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

看看StackTrace就知道,这个错误是由于ViewState引发的。ViewState是个让人即爱又恨的东西。说是爱吧,是因为用起来很方便,控件的状态能自动维持。说是恨吧,原因是其性能不是太高,尤其是页面较大的时候。不知道当初微软在设计.NET的时候为什么的引入ViewState机制,我研究过一些用.NET开发的网站,很多网站都是直接禁用了ViewState。原因很简单,一个稍微大一点的页面,产生的ViewState简直让人受不了,这么大的ViewState将对网络带宽带来极大的压力。同时,对系统性能也会造成一定的影响,因为为了能把数据存储在网页中,系统必须对各种对象做串行化处理,最后编码为Base64的字符串存储在网页中的隐藏字段中(一般默认是存储在名为__VIEWSTATE的隐藏Field中)。当网页被Post到服务器的时候,服务器又将对里面的数据做反串行化处理,在反串行化之前还得验证数据的完整性和正确性。上面这个错误,就是因为在反串行化的过程中,由于客户端浏览器未能完整的Post保存在ViewState中的数据而引发的异常。如果用户所在的网络情况不是很好,Post一个表单需要较长的时间,用户在等待的时候点击了“停止”按钮,或者干脆转向了其他页面,这个时候,客服端单方面中断了网络链接,即所谓的“The client disconnected”,导致回发的ViewState不完整而引发了此异常。一般情况下,这个异常对于服务器和用户体验都不会带来太大的影响,故服务器在捕获到这个异常的时候可以忽略它。

即便我们可以忽略这个异常,但有几点还是值得注意和思考:

1. 页面中不需要的ViewState的控件,尽量将其EnableViewState设置为False,这样可以大大降低网页的ViewState。如果你的页面更本不需要使用ViewState,则干脆从页面级,甚至是整个站点级(在Web.config中设置)禁止ViewState,这样就能有效防止该异常的发生,同时提高系统性能。

2. ViewState从设计上来说是个好东西,但苦于网站的带宽和服务器资源总是有限的,所以在设计网站的时候,就得尽量少用ViewState。等什么时候,我们的网络带宽足够大,并且Server足够Powerful的时候,这个问题就可以忽略了。

3. 如果非要使用ViewState,有两种方法可以减少ViewState的大小。第一,启用压缩技术。在ViewState被发送到客户端之前,调用压缩算法将其压缩。根据我的经验,就是一般的zip压缩,压缩率也在30-50%之间,有的甚至更高,这取决于具体的数据。当数据回发的时候,先将其做解压缩处理,然后在执行其他的ViewState操作。第二,将ViewState存储在服务器的硬盘上面,道理一样,在发送到客户端之前,将数据以文件的形式保存在服务器的硬盘上。这里需要注意的是文件名必须的唯一,原因就不多说了。当页面回发的时候,直接根据文件名从硬盘上加载ViewState即可。这两种方式的实现都很简单,重写页面的如下两个事件即可:

Code
protected override void SavePageStateToPersistenceMedium(object viewState)
{
    // 压缩ViewState或者存到到硬盘上
}

protected override object LoadPageStateFromPersistenceMedium()
{
    // 解压ViewState或者从硬盘加载数据
}

上面谈到的两种方法都有其局限性,第一种方法节约了网络带宽,牺牲了CUP计算时间,因为压缩算法还是比较费CPU时间的。第二种方法,极大的节约了网络带宽,但也极大的增加了I/O的负荷。具体用那种方法,只能具体问题具体分析了,不能一概而论。

4. 如果本身网页的ViewState不是很大,网站却经常抛出这个异常,则至少可以说明你的网站速度太慢了,用户在提交表单的时候需要花费一个较长的等待时间。这种情况,就得考虑为你的网站做带宽和硬件上的升级了。

好,就到这里吧。欢迎就此问题展开深入讨论。

其他文章导读:

1. 史上最强的美名腾智能起名成功发布2. 美名腾界面升级了3. 探密诡异的HTTP Referer总是为空的原因4. 为你的网站定制一套统一的异常处理机制

转载于:https://www.cnblogs.com/dreamstudio/archive/2009/04/07/1430946.html

由ViewStateException: The client disconnected想到的相关推荐

  1. 魔改车钥匙实现远程控车:(1)整体思路及控制方案实现

    前言 作为一个在互联网时代成长起来的人,怎么能忍受自己的爱车不支持远程控制呢. 连我的小电驴都支持手机靠近自动解锁,蓝牙/网络远程控车.而我的汽车却不支持,实在是说不过去,所以萌发了自己改造一下让它支 ...

  2. Proxy源代码分析--谈谈如何学习linux网络编程

    Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到,Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该是 ...

  3. 【Android音视频开发】- 实时采集视频

    前言 通过我的上一篇文章,可以知道直播大致有几个步骤:音视频采集 -> 美颜/滤镜/特效处理 -> 编码 -> 封包 -> 推流 -> 分发 -> 解码/渲染/播放 ...

  4. python twisted 笔记

    2019独角兽企业重金招聘Python工程师标准>>> 1.Twisted框架构建简单的C/S 要写一个基于twisted框架的服务器,你要实现事件处理器,它处理诸如一个新的客户端连 ...

  5. C++回声服务器_5-多进程版本

    服务器和客户端都是用多进程来接收和发送数据. 服务器代码 #include <cstdio> #include <cstdlib> #include <cstring&g ...

  6. 微信协议简单调研笔记

    前言 微信可调研点很多,这里仅仅从协议角度进行调研,会涉及到微信协议交换.消息收发等.所谓"弱水三千,只取一瓢"吧. 杂七杂八的,有些长,可直接拉到最后看结论好了. 一.微信协议概 ...

  7. python network_python network(非常好)

    关于网络编程以及socket 等一些概念和函数介绍就不再重复了,这里示例性用python 编写客户端和服务器端. 一.最简单的客户端流程: 1. Create a socket 2. Connect ...

  8. 使用RSClientPrint直接打印本地RDLC报表

    最近一个项目使用ReportViewer来呈现本地RDLC模块的报表,需要用户点击至少三次才能直正打印,用户感觉易用性很不好,需要我们修改. 经过网上查找相关资料,发现直接使用ACTIVEX控件RSC ...

  9. 在flask上使用websocket

    在flask上使用websocket Flask-Sockets和Flask-SocketIO之间的主要区别在于前者仅仅将WebSocket协议(通过使用gevent-websocket项目)进行包装 ...

最新文章

  1. 最全的大数据解决方案(多图)
  2. 10-03视图的优缺点及注意事项
  3. IDEA出现import org.junit.Test飘红解决方案
  4. linux学习笔记-不定时更新
  5. 老男孩python21期作业_(禁闲聊)绘画讨论10个群第176期作业展示
  6. 网页里面的下拉框与数据库交互
  7. 李建中黑大计算机学院院长,向您致敬 | 我校开展教师节走访慰问活动
  8. ffmpeg实战教程(二)用SDL播放YUV,并结合ffmpeg实现简易播放器
  9. Python中出现“TabError: inconsistent use of tabs and spaces in indentation”
  10. Atlassian JIRA 插件开发之三 创建
  11. 《Fortran 95 程序设计》阅读笔记二
  12. 轮询、长轮询、长连接、websocket
  13. OCR识别提取图片中文字原理
  14. Acwing1183. 电力
  15. 遇到问题--python---ImportError: Missing optional dependency ‘xlrd‘. Install xlrd >= 1.0.0 for Excel supp
  16. Spring Cloud Loadbalancer
  17. 第八十七篇 朴素贝叶斯
  18. unity 粒子插件_unity的基本认识——走进unity
  19. thinkphp5学习路程 三 数据库操作
  20. 在Eclipse上搭建Android开发环境

热门文章

  1. ai python 面试_面试分享系列 | 17道Python面试题,让你在求职中无往不利
  2. java byte 图片浏览器直接显示_在imge控件中直接显示图片(图片是byte[]格式)
  3. mysql清除旧版本_MYSQL使用INNODB时及时清理旧版本数据
  4. DE14 Interpretation of the Exceptional Case: Resonance
  5. 【python】快速对图像进行傅里叶变换
  6. 工业用Linux版本,工业主板支持哪些版本的LINUX系统?
  7. C++输出倒三角加数字
  8. 消费者价格研究中的数据分析
  9. md360 android,MD360Player4Android 学习的简单使用
  10. kinect v1原理_Kinect原理及介绍.ppt