这真的是一个ASP.NET Web Forms Bug吗?

时间:2010-01-19 08:09:29

标签: .net asp.net

我有一个由一组负载平衡服务器托管的Web应用程序。 我在母版页上有一个ASP.NET文本框和按钮,用于获取值并在数据库中搜索它。 搜索结果显示在名为search.aspx的页面上,该页面采用查询字符串,其中包含在母版页上放置的文本框中输入的值。

母版页上的按钮只需Respose.Redirect到search.aspx页面,并带有提到的查询字符串。

有时搜索是和平执行的,有时会抛出以下异常:

  

viewstate MAC验证失败。如果   此应用程序由Web托管   农场或集群,确保    配置指定   相同的validationKey和验证   算法。无法使用AutoGenerate   在群集中。

我无法让所有服务器上的机器密钥相同,因为它们托管其他网站。 我认为这是因为一组负载均衡的服务器。 我试过EnableViewStateMac =“false”,ValidateRequest =“false”,EnableEventValidation =“false” 但没有区别。

我尝试了以下解决方案:

  • 设置按钮的PostBackUrl search.aspx的主页面 页面并删除Response.Redirect in 的Click事件处理程序 按钮。
  • 读取的值 的Request.Form [ “SearchCriteriaTextBox”] 在search.aspx页面的加载中。

但实际上我发现它可以在页面不继承母版页时起作用,而这不是我的情况。 那该怎么办?????

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

您可以在web.config中覆盖机器密钥:

<machineKey validation="SHA1"
    validationKey="ABC123..."
    decryption="Auto"
    decryptionKey="DEF567..." />

如果您在每个方框上执行相同操作,则只会影响您的网站,并会阻止此错误。

答案 1 :(得分:1)

看看这里:Validation of viewstate MAC failed

似乎您需要在所有服务器上的web.config中使用相同的验证密钥。要获取新的计算机密钥,您可以使用Pete's Nifty Machine Key Generator

答案 2 :(得分:1)

您可以在应用的web.config文件中设置机器密钥,这样就不会影响服务器上的其他网站。
http://msdn.microsoft.com/en-us/library/ms998288.aspx#paght000007_webfarmdeploymentconsiderations

答案 3 :(得分:1)

这不是一个错误,它是设计的。

ViewState和其他加密项使用validationKey和algorythm来获取密文。在webfarm中,这些需要在所有机器上相同才能匹配。

您可以在web.config中覆盖此设置:

<machineKey validation="SHA1"
  validationKey="ABC123..."
  decryption="Auto"
  decryptionKey="DEF567..." /> 

这应该在作为webfarm一部分的每个站点上完成。

根据建议,您可以使用Pete's Nifty Machine Key Generator生成此设置。