2

次のシナリオに追いつきました。

  • .Net 2.0 フレームワークで実行される Web アプリケーションがあります。
  • 顧客は、.Net 4.5 フレームワークで実行される Web アプリケーションを持っています。

彼らのページの 1 つから私たちのページにデータを投稿すると、システム エラーが発生します。問題を検証するために、同じサーバーに 2 つの 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

私は次のことを試しました:

  • Page タグで EnableViewState = false。しかし、まだ .Net は _VIEWSTATE 隠し変数を追加しています。

  • _VIEWSTATE 隠し変数を空に設定する Javascript 関数を追加しました。これで問題は解決しました。

2 回目の解決策で問題は解決しましたが、この種の問題を解決するためのより良い方法を探しています。

4

1 に答える 1

1

EnableViewState = falseViewState のみをオフにしますが、ASP.NET サーバー コントロールのコントロール状態はオフにしません。そのため、非表示の VIEWSTATE コントロールがまだ残っています。

ViewState はサーバー上でハッシュ コード化されるため、同じキーを使用してハッシュを生成する必要があります。<machinekey>machine.config ファイルの を両方のアプリケーション/サーバーで同じ値に設定します。デフォルト値は ですAutoGenerate。これは、すべてのサーバーが独自のマシンキーを持っていることを意味します。詳細はこちら

別の方法として、false に設定してハッシュをオフにしEnableViewstateMacます (基本的にはエラー メッセージの内容)。これにより、ユーザーは ViewState を操作できます。

于 2013-11-12T20:23:10.763 に答える