【问题标题】:Error while posting data from ASP.Net 4.5 to ASP.Net 2.0 web application将数据从 ASP.Net 4.5 发布到 ASP.Net 2.0 Web 应用程序时出错
【发布时间】:2013-11-12 19:43:12
【问题描述】:

我们遇到了以下情况:

  • 我们有一个在 .Net 2.0 框架上运行的 Web 应用程序。
  • 客户有一个在 .Net 4.5 框架上运行的 Web 应用程序。

当他们将数据从他们的一个页面发布到我们的页面时,我们会遇到系统错误。为了验证这个问题,我在同一台服务器上部署了两个 Web 应用程序,并尝试将表单从 webapp 1(在 4.5 上)发布到 webapp 2(在 2.0 上)。我遇到了错误。

[ViewStateException: Invalid viewstate. 
Client IP: 127.0.0.1
Port: 63153
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
ViewState: /wEPDwUKLTM1MTA1NjA1MmRk6CPd6yG4r8HEbqBZi3i4jiLLnZotIlX7+6zAZaceaGY=
Referer: http://localhost/test4/default.aspx
Path: /test2/default.aspx]

[HttpException (0x80004005): Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.]
System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) +148
System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) +11065601
System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState) +59
System.Web.UI.HiddenFieldPageStatePersister.Load() +11065704
System.Web.UI.Page.LoadPageStateFromPersistenceMedium() +11150648
System.Web.UI.Page.LoadAllState() +46
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +11146167
System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +11145706
System.Web.UI.Page.ProcessRequest() +91
System.Web.UI.Page.ProcessRequest(HttpContext context) +240
ASP.default_aspx.ProcessRequest(HttpContext context) in     c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET     Files\test2\b4717a74\d7ba8639\App_Web_ha1suqrp.0.cs:0
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +599
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +171

我尝试了以下方法:

  • EnableViewState = 页面标记中的假。但是 .Net 仍然在添加一个 _VIEWSTATE 隐藏变量。

  • 添加了一个 Javascript 函数来将 _VIEWSTATE 隐藏变量设置为 空的。这解决了问题。

虽然第二个工作解决方案解决了问题,但我正在寻找更好的方法来解决此类问题。

【问题讨论】:

    标签: c# javascript asp.net .net


    【解决方案1】:

    EnableViewState = false 只关闭 ViewState,而不关闭 ASP.NET 服务器控件的控件状态,这就是为什么您仍然拥有隐藏的 VIEWSTATE 控件。

    ViewState 在服务器上进行了哈希编码,因此您应该使用相同的密钥来生成哈希。您将 machine.config 文件中的 &lt;machinekey&gt; 设置为两个应用程序/服务器上的相同值。默认值为AutoGenerate,这意味着每个服务器都有自己的机器密钥。你找到更多信息here

    作为替代方法,您可以通过将 EnableViewstateMac 设置为 false 来关闭散列(基本上就是您的错误消息所说的)。通过这样做,用户可以操纵您的 ViewState。

    【讨论】:

    • 我在同一台服务器上托管了这两个应用程序。同样在阅读您的回复后,请按照帖子为同一服务器上的所有应用程序应用常量密钥集。我还在 Web App 1 上将 EnableViewstateMac 设置为 false,但是在将数据从 4.5 应用程序发布到 2.0 应用程序时仍然出现上述错误。我测试的另一个案例是,将数据从 .Net 2.0 应用程序发布到 .Net 2.0 应用程序。它们工作正常。
    • 两个 .NET 版本的 machine.config 文件位于不同的目录中。当您关闭 EnableViewStateMac 时,我无法相信您会收到错误消息。我会尝试在两个页面上都关闭它。
    • 在两个站点页面上将 EnableViewStateMac 设置为 false 解决了该问题。这必须在为所有网站配置相同的机器密钥之上完成。感谢您的帮助。
    • 我认为您需要一个或另一个来解决问题。关闭 EnableViewStateMac 或设置相同的 MachineKey。越晚越好。
    猜你喜欢
    • 2014-03-15
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多