【问题标题】:invalid viewstate error - OnPreRender无效的视图状态错误 - OnPreRender
【发布时间】:2010-04-11 03:00:04
【问题描述】:

我的网站每天出现 100 多个错误,出现 System.Web.HttpException: Invalid viewstate。

该网站是在 iis6 上运行的 asp.net 3.5 ,而不是在 web-garden/web-farm 单一服务器中运行。

这里有一些示例错误。

Machine: ML Framework Version: 2.0.50727.3603 Assembly Version: 6.5.3664.33889 
Source: http://www.domain.com/WebResource.axd?d=z5VmXXoSLLpQHoPictureAlert 
Exception: System.Web.HttpException: Invalid viewstate. at System.Web.UI.Page.DecryptStringWithIV(String s, IVType ivType) at System.Web.Handlers.AssemblyResourceLoader.System.Web.IHttpHandler.ProcessRequest(HttpContext context) 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

Machine: MLFramework Version: 2.0.50727.3603 Assembly Version: 6.5.3664.33889 
Source: http://www.mydomain.com/ScriptResource.axd?d=SE0Ej7OlEAx91j2Cjv_6KkRPplqT-5wB4M7CZPdGdGn3LahLwqlRPApUcdxBsbFXYHZ91Q76FHAHWgHs8SmOC4zemr7
siym0QY0rF3XtJTu%3C/a%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ca%20id= 
Exception: System.Web.HttpException: Invalid viewstate. at System.Web.UI.Page.DecryptStringWithIV(String s, IVType ivType) at 
System.Web.UI.Page.DecryptString(String s) at System.Web.Handlers.ScriptResourceHandler.DecryptParameter(NameValueCollection queryString) at 
System.Web.Handlers.ScriptResourceHandler.ProcessRequestInternal(HttpResponse response, NameValueCollection queryString, 
VirtualFileReader fileReader) at System.Web.Handlers.ScriptResourceHandler.ProcessRequest(HttpContext context) at 
System.Web.Handlers.ScriptResourceHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext context) at 
System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at 
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 
  1. 我已经尝试用//<![CDATA[ //]]> 包装所有内联javascript
  2. 我已经将 enableViewStateMac 设置为 false。

通过查看从“d”参数中猜出的所有错误,它似乎集中在我网站上的单个用户控件上。 在这个控件中,我在 usercontrol OnPreRender 函数中更改了 div 的 + 文本的可见性。

protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            PreparePage();
        }

错误是否与用户控件行为有关?

谢谢!

【问题讨论】:

  • 该覆盖事件是在用户控件还是父页面中?
  • 用户控件中的OnPreRender。

标签: asp.net viewstate


【解决方案1】:

如果您的网站在网络场中运行,这可能与使用不同的机器密钥有关。例如,如果一个服务器用于对视图状态进行编码,那么如果另一台服务器没有相同的机器密钥,它就无法对其进行解码。结帐this article。即使您没有多台服务器,也请尝试指定fixed machine keys

【讨论】:

  • 这是您的答案,网站不在 webgarden/webfarm 中。你觉得用固定机钥匙还有用吗?
  • 另外,我已经设置了 enableViewStateMac="false" 应该取消机器键的效果
  • 我添加了一个固定的机器密钥以确保...不是运气错误仍然不断出现。还有其他想法吗?谢谢!
【解决方案2】:

无效的 ViewState 异常通常来自 ASP.NET 的内置事件验证。关闭 EnableViewStateMac 只会停止基于 MAC 的加密,而不是视图状态验证。为此,您需要在 Page 指令中设置 EnableEventValidation="false"。

至于为什么会发生……三个可能的原因:

1) 您正在修改客户端控件的内容(例如 DropDownList 项)。

2) 页面在 ViewState 验证字段被呈现之前被回发。

3) 您的网站是搜索漏洞的恶意脚本的目标...在这种情况下,EventValidation 正在发挥作用。

我想说#1 最有可能...但 #2 也很常见,尤其是当您看到此错误不一致时。

【讨论】:

  • 我不想关闭视图状态验证,我相信它的存在是有目的的。关于如何跟踪导致错误的页面/控件的任何想法?
  • 作为一项安全功能,我想说它几乎是最不重要的事情。 MS 自己建议在这种情况下将其关闭。至于找到控制……它是否始终如一地发生?如果不是,那么它可能是 #2,除了减小渲染页面的大小之外,您无能为力。
  • 是的,它始终如一地发生,每天 100 多个错误。当“d”参数有 3-5 个重复值时。如何找出错误来自哪个页面?
  • 事件查看器应该向您显示导致任何未处理异常的 URL。这里有更新吗?我已经出去几天了。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 2013-02-21
  • 2014-10-05
  • 1970-01-01
  • 2011-12-30
相关资源
最近更新 更多