2010-01-24 38 views
1

我遇到了一個我正在管理的Web應用程序的問題。偶爾會出現以下錯誤的用戶:ASP.NET應用程序每隔幾分鐘就會損壞視圖狀態

Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.

問題是它不是一個集羣 - 它是一臺Windows 2003服務器。周圍挖之後,似乎增加了的machineKey部分和一些額外的屬性到頁面在我的web.config指令解決這個錯誤:

<machineKey validationKey='MACHINE KEY SNIPPED' 
     decryptionKey='DECRYPTION KEY SNIPPED' 
     validation='SHA1'/> 

<pages validateRequest="true" enableEventValidation="false"> 

在我的web.config改變這兩樣東西后,錯誤消失,但現在我有一個新問題 - 而不是一個錯誤,我的viewstate無效,應用程序只是「忘記」我的用戶是誰,並將它們發送回登錄頁面。現在,用戶正在瀏覽應用程序,然後他們意外地被髮送到登錄頁面,即使他們已經登錄了幾分鐘。雖然我不能強迫這種情況發生,但通常會在訪問10-12個不同的頁面時發生,因此經常發生。

我很想解決這個問題 - 是否有人知道還有什麼可能導致單個服務器上的視圖狀態錯誤,或者我能做些什麼來確保它的正確驗證?

+0

永遠不要關閉事件驗證。有一個非常狹窄的時間你想要做到這一點,並試圖繞過導致你的應用程序池回收的東西不是其中之一。現在,如果攻擊者知道他們在做什麼,他們將能夠觸發事件以禁用頁面上的隱藏控件。 – blowdart 2010-01-24 16:27:10

+0

你在做網址重寫嗎?如果是這樣的網址被設置爲匹配頁面,表單驗證反對?使用相同的錯誤消息更改表單驗證toasts查看狀態。 – 2010-01-24 18:24:29

+0

任何解決方案? – Kiquenet 2011-01-04 09:52:10

回答

0

事實證明,當我向正在運行我們的應用程序的應用程序池中添加額外的工作進程時,開始發生這種情況。由於會話狀態被存儲在InProc中(而不是存儲在狀態服務或SQL Server中),因此會丟失用戶在工作進程間切換時的用戶身份。就目前而言,將服務器上的進程數量減少到一個可以解決問題,因爲提高它似乎沒有任何改進。

3

聽起來好像工作進程正在自我回收(假設你正在存儲進程中的會話狀態)。選擇固定鍵意味着視圖狀態在進程恢復時仍然有效,但是您失去了會話狀態。您可以嘗試將會話狀態存儲在數據庫中,但我更關心解決基本問題。您的應用程序是否突然分配大量內存或類似的東西?事件日誌中是否有任何可疑內容?

+1

@rwmnau:如果事實證明如此,您可能需要從流程中提取會話。不需要擁有InProc會話,您需要使用SQL或狀態服務器。這也意味着確保你的自定義類是可序列化的。 – 2010-01-24 17:00:58

+1

工作進程不應該無故回收.. :-) – Robert 2010-01-24 20:11:20

+0

工作進程有其原因,其原因不知道;-) – 2010-01-24 21:39:34

相關問題