关于"无法验证数据"的问题

来源:互联网 发布:php收银系统源码 编辑:程序博客网 时间:2024/06/02 23:40
首页 本类 焦点难题:关于"无法验证数据"的问题


一个普通的提交网页,如果在很短的时间内提交不会出现问题,但如果在大概30秒后提交的话,就提示"无法验证数据"的问题.搜索了CSDN上以前的帖子,发现一直没有人解决,希望再次提出能有人提供解决的方案.
   测试网址: www.zt6969.com/ttt/RangeValidator2.aspx
   问题触发:在大概30秒后提交即触发此事件.如果打开立即提交的话则一切正常.
    个人分析:1. 此问题与时间有关
             2.可能与ViewState有关.(但就是关闭VeiwState也存在这问题)
             3.另外不知是否与Cookie有关系.
     如果有朋友也遇到相同的问题而没有解决的,欢迎进行讨论,我的QQ:149204016
    这个问题很急,要是真的解决不了,怕是网站都开发不成了.


设断点跟踪,看看是在哪里出的错误,把相关的错误代码贴出来.


自己写一个自定义验证控件吧


[HttpException (0x80004005): Authentication of viewstate failed.  1) If this is a cluster, edit <machineKey> configuration so all servers use the same validationKey and validation algorithm.  AutoGenerate cannot be used in a cluster.  2) Viewstate can only be posted back to the same page.  3) The viewstate for this page might be corrupted.]
   System.Web.UI.LosFormatter.Deserialize(String input) +118
   System.Web.UI.Page.LoadPageStateFromPersistenceMedium() +102
[HttpException (0x80004005): Invalid_Viewstate
Client IP: 210.83.210.238
Port: 33260
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)
ViewState: dDwtMTU2NjIyMzcyNDs7PrsxAAi/+5PmnGQ8AdSVGfQvyzYc
Http-Referer: http://www.zt6969.com/ttt/RangeValidator2.aspx
Path: /ttt/RangeValidator2.aspx.]
   System.Web.UI.Page.LoadPageStateFromPersistenceMedium() +443
   System.Web.UI.Page.LoadPageViewState() +18
   System.Web.UI.Page.ProcessRequestMain() +447
光看这些不够哦,你还是把代码贴出来看看吧。


我也曾经碰到过验证控件失效的问题,后来我解决了!以下是我的分析:你也可以试试!
问题的原因:你本地的机器和服务器上的装的.NET Framework的版本不是一样的!
因为asp.net的验证控件验证都是需要.NET Framework自带的aspnet_client内的.js文件来支持!
.NET Framework版本不一样导致自带的aspnet_client内的文件也有细微的差别,就会导致asp.net的验证控件部分验证失效。比如我的本地机器的.NET Framework 版本: 1.14322.573 。服务器的.NET Framework 版本: 1.14322.2032。
解决办法:首先去下个asp.net探针,可以去http://down.chinaz.com/S/6936.asp下载!看看本地和服务器.NET Framework 版本各是多少!得到服务器.NET Framework 版本以后要找到这个版本aspnet_client文件夹放到空间上!这样你的控件就应该好使了!


不一定能解决但是可以试一下!


比较神奇的问题


沒有遇到過,路過這裏,學習一下.......


代码我敢保证决对没有问题,在本机测试一切正常.
  zipo(Multiple-Inheritance OOP)的方法试过一下,服务器的.NET Framework 版本: 1.14322.2032
,但我找到不这个版本aspnet_client文件,不过我想这个影响的应该是控件不太好使,并不会出现
ViewState截断或破坏.
   测试页代码:
<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="gb2312" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
<script language="C#" runat="server">
void Button1_Click(Object src,EventArgs e)
{
Ran1.Validate();
if(Ran1.IsValid)
message1.Text="验证通过";
else
message1.Text="验证失败";
Ran2.Validate();
if(Ran2.IsValid)
message2.Text="通过";
else
message2.Text="失败";
Ran3.Validate();
if(Ran3.IsValid)
message3.Text="通过";
else
message3.Text="通过";
if(Page.IsValid)
lab.Text="页面执行通过";
else
lab.Text="页面执行失败";
}
</script>
</head>
<body>
<center>RangeValidator控件验证</center>
<br/><br/>
<form runat="server">
整型数据验证(取值范围1-10):
<asp:TextBox id="tex1" MaxLength="20" runat="server" /> <asp:Label id="message1" runat="server" />
<asp:RangeValidator Display="Dynamic" ID="Ran1" 
 ControlToValidate="tex1" Type="Integer" ErrorMessage="失败"
 MaximumValue="10" MinimumValue="1"  runat="server" />
<br/><br/>
字符型数据验证(取值范围a-h):
<asp:TextBox id="tex2" MaxLength="20" runat="server" /> <asp:Label id="message2" runat="server" />
<asp:RangeValidator Display="Dynamic" ID="Ran2" ControlToValidate="tex2" Type="String" 
 ErrorMessage="失败" MaximumValue="h" MiniumValue="a" runat="server" />
<br/><br/>
浮点型数据验证(取值范围1.0-20.0):
<asp:TextBox id="tex3" MaxLength="20" runat="server" /> <asp:Label id="message3" runat="server" />
<asp:RangeValidator Display="Dynamic" ID="Ran3" ControlToValidate="tex3" Type="Double" 
 ErrorMessage="失败" MaximumValue="20.0" MiniumValue="1.0" runat="server" />
<br/><br/>
<asp:Button Text="确认" OnClick="Button1_Click" runat="server" />
<br/><br/><hr><br/>
<asp:label id="lab" runat="server" />
</form>
</body>
</html>


这个问题存在于网站的每一个提交本身的页面上,而与是否自定义控件无关.


自己顶下,想了N久,终于解决问题了.希望对碰到此问题的朋友能有所帮助.
   
   1.解决方法:在Page指令中设置禁止MAC(身份验证代码 ):
<% @ Page EnableViewStateMac="false">
   个人分析:当网页提交给本身时,服务器会通过MAC以检查视图的状态,看状态是否在客户端被更改.但这也就导至一个潜在的问题,即服务器端的状态一般保持时间很短,如果在服务器上状态消亡后再提交页面的话,就会造成MAC验证不通过,产生无法验证的错误提示.
   这个解决方法也存在很多麻烦,比如需要在每个提交给自身的页面加上这条指令.而且存在一些安全隐患,如有人恶意更改视图状态等.
7楼  gyyshuai   (师无横) 二级用户 该版得分小于等于500分,大于100分  回复于 2005-04-06 09:45:05  得分 0

据说这个问题是因为在iis接受页面传过来的数据时,需要对它进行加密,而加密的算法和key值,在machine.config中默认的时候没有设置,因此iis每次自动生成key值,当有多个进程的时候,key值可能不相同,因此不能够解密成功。  
  解决的方法有两种:  
  一种是在machine.config中设置key值  
  一种是在应用程序的web.config中增加processModel节点,设置加密的key值,这样保证只用一个key值加密
Top
8楼  gyyshuai   (师无横) 二级用户 该版得分小于等于500分,大于100分  回复于 2005-04-06 10:00:19  得分 80

补充一下,不是processMdodel,是machineKey节点,  
  默认的配置文件如下:  
  <machineKey   validationKey="AutoGenerate,IsolateApps"    
                          decryptionKey="AutoGenerate,IsolateApps"    
                          validation="SHA1"/>  
  你可以删除掉IsolateApps   ,也可以自己填一个。  
  这个节点在<system.web>下面   
 

原创粉丝点击