• [转】解决ViewState状态异常一例


    故障描述:基础数据中访问学生帐号信息打印功能,出现

    Server Error in '/NewCourseReform_Base' Application.
    --------------------------------------------------------------------------------

    The state information is invalid for this page and might be corrupted. 
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.Web.HttpException: The state information is invalid for this page and might be corrupted.

    故障分析:

    典型的ViewState异常错误,在web.config里加上一句:

    在web.config里将<pages validateRequest="false"/>注销掉
    像这样 <!--<pages validateRequest="false"/>-->
    然后添加
     <pages validateRequest="false" enableEventValidation="false" viewStateEncryptionMode ="Never" />  

    可以用记事本打开web.config,然后ctrl+f 找到 <pages validateRequest="false"/>

    据说这个问题是因为在iis接受页面传过来的数据时,需要对它进行加密,而加密的算法和key值,在machine.config中默认的时候没有设置,因此iis每次自动生成key值,当有多个进程的时候,key值可能不相同,因此不能够解密成功。   
      解决的方法有两种:   
      一种是在machine.config中设置key值  

    一种是在应用程序的web.config中增加machineKey节点,设置加密的key值,这样保证只用一个key值加密 
       
      默认的配置文件如下:   
      <machineKey   validationKey="AutoGenerate,IsolateApps"     
                              decryptionKey="AutoGenerate,IsolateApps"     
                              validation="SHA1"/>   
      你可以删除掉IsolateApps   ,也可以自己填一个。   
      这个节点在<system.web>下面  

     

    ASP.NET 2.0状态管理的新增功能

    • 视图状态分块

    – 图状态提供了一种简单的方法来自动保持页上的字段和控件数据,而不需要在往返服务器期间手动请求并重新填充。它还允许在ViewState 属性中存储页上的自定义数据。

    – 但是,在某些情况下,视图状态数据会变得很大。因为视图数据存储在隐藏的字段中,某些代理或防火墙会阻止对包含这些数据的页的访问。因此,ASP.NET 2.0 页框架引入了一种名为视图状态分块的功能。如果视图状态的数据量变得太大,视图状态分块自动将数据分成多个块区,并将这些数据放在多个隐藏形式的字段中。

    –     若要启用视图状态分块,请将MaxPageStateFieldLength 属性设置为在单个视图状态字段中允许的最大大小(以字节为单位)。当该页回发到服务器时,该页会在页初始化阶段分析视图状态字符串,并还原页中的属性信息。默认设置是-1,这表示不存在最大大小,不会将视图状态分成多个块区

    【源代码】

    一般情况下我们可以从客户端看到视图状态保存到隐藏域中:


    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"

    value="/wEPDwUJNzYxNDY3MTEyZGQvZPaoYFqnx4XzmHlNwsjTrbK3hw==" />

    修改配置文件如下,设置单个视图状态字段中允许的最大大小为50字节:

    <system.web>

    <pages maxPageStateFieldLength="50"/>

    </system.web>

    查看客户端VIEWSTATE的隐藏域的名字会增加,也就是把数据块分割成多个:

    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"

          value="/wEPDwUJNzYxNDY3MTEyZGQvZPaoYFqnx4XzmHlNwsjTrbK3hw" />

    <input type="hidden" name="__VIEWSTATE1" id="__VIEWSTATE1" value="==" />

    2007.8.18和19号,我再次游玩了大明山,一样的山,一样的水,还是那样的尽兴;唯独更换了伙伴。远离水泥森林,漫步在山道上,是那样的悠闲、愉悦。晚上回到家,我居然很有兴致的看起ASP.NET2.0书来,看了一章关于介绍ViewState,对ViewState也有了新的理解。
            ViewState的出现,使我们开发程序变得更加方便、快捷,但是它也使我们的程序变得臃肿。ViewState可以很方便的帮我们存储控件的状态和值(ASP.NET2.0有ControlState,专门来保存控件的状态),当页面以Html方式展现在我们面前的时候,ViewState是以一个隐藏控件的方式写在Html中,如: 
    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMjgzMDgzOTgzZGRqBJ2DrJA0WVW8LiR3445iRDt1sg==" />

    value保存了控件状态和值,采用Base64编码方式保存,大家可以从http://www.pluralsight.com/tools.aspx上下载Fritz Onion的ViewState解码器ViewState Decoder (2.2)。具体的使用方法,自己下载下来使用,比较简单。ViewState很容易进行解码,因此敏感的信息最好不要保存在ViewState中。
            在实际的项目中,我经常看到ViewState的长度有几个屏幕的看不完的情况。如果遇到防火墙对POST请求值有最大尺寸限制的情况下,问题就会出现,常常会被防火墙拒绝。
            这个时候,就需要我们采用合理的方法来处理ViewState,通常我们建议ViewState的大小不超过总页面的30%。
    1、分解ViewState
    ASP.NET2.0开始在Page类中有MaxPageStateFieldLength属性,以字节为单位。这样的话,如果ViewState的长度超过最大长度,就会自动分解成多个块。ASP.NET1.1中还没有这个功能,实现起来也没有这么方便,需要重写LoadPageStateFromPersistenceMedium和SavePageStateToPersistenceMedium方法来实现。

    2、压缩ViewState
    我们可以从icsharpcode.net上下载开源的SharpZipLib库,来实现ViewState的压缩和解压缩。

    3、把ViewState放到其他位置存储
    当ViewState超过20k,或者更大的时候。我们可以考虑把ViewState存储到Session中,每个页面有自己的GUID,这个GUID声明作为value值,根据GUID来设置和读取ViewState的值。也可以通过重写LoadPageStateFromPersistenceMedium和SavePageStateToPersistenceMedium方法来实现。

    4、把ViewState移到页面底部
    通过重写页面的Render方法来实现。

    以上是处理ViewState的一些方法,写起来太累,至于具体实现方法的代码,可以网上搜索一下,欢迎大家提出更好的意见

     

    原文:http://newcoursereform.blog.sohu.com/97932288.html

  • 相关阅读:
    美女检测器
    汉字动画程序的原理
    值类型不是值类型(ValueType is NOT a Value Type):闲谈.Net类型
    PowerShell 简介
    Visual Studio 2012 RC 发布
    使用 MvcMiniProfiler 监控EF 4.1 with MySQL Provider
    NuGet安装及简单使用
    发布自己的NuGet程序
    Qizmt 单机及分布式部署注意事项
    JDynamic :支持Json反序列化为Dynamic对象
  • 原文地址:https://www.cnblogs.com/NovaXie/p/2561443.html
Copyright © 2020-2023  润新知