2012-03-27 94 views
1

我有一個運行在IIS6上的ASP.net 3.5 SP1 Web應用程序,並且在Web配置中設置了機器和驗證密鑰。該應用程序在Safari瀏覽器以外的所有瀏覽器上正常運行。ASP.NET Viewstate與Safari 5.x

頁面正確加載,但執行回發時收到「驗證視圖狀態失敗」錯誤。 (另外,應用程序池只能在夜間每天回收一次,但這應該不會因關鍵點固定而產生差異。)

我在因特網上發現了幾個建議,包括通過限制viewstate字段的大小web配置,並禁用Safari中的預取 - 其中非工作。

我在Stackoverflow上發現了其他帖子,但他們中沒有人幫助解決了這個問題。

這是Safari的已知問題還是有其他人遇到過這個問題?

回答

0

從2012年3月12日開始,我們遇到了類似的問題,這是Safari 5.1.4發佈的日子。 Safari 5.1.5也會出現問題。它發生在safari的windows和mac版本上。

在我們的案例中,由Safari提交的視圖狀態是一個完整的視圖狀態,不幸的是它是在前一頁而不是在發佈頁面。

在提交之前驗證這一點

  1. 首先,遇到問題的頁面上查看源檢查視圖狀態。這通常是base64編碼的,可能會被加密。如果您的網站將其加密,則可能需要關閉此功能以檢查視圖狀態。您可以在互聯網上搜索base 64解碼器,有幾個站點可以將__Viewstate字符串粘貼並解碼。
  2. 提交頁面並收到錯誤。如果您在瀏覽器中看到自定義錯誤,它會顯示服務器收到的viewstate值。如果沒有轉到服務器上的應用程序事件日誌並查找記錄的錯誤消息。按照與步驟1相同的方式對郵件中的視圖狀態進行解碼。
  3. 檢查兩個視圖狀態的內容,通常您可以通過數據告訴視圖狀態是屬於發佈到的頁面還是其他頁。

所以,如果你發現它們不同,你可能遇到了我們遇到的問題。

在我們的案例中,導致問題的違規代碼實際上位於上一頁。在PageOne中,我們使用window.onload事件並調用了form [0] .submit。服務器以PageTwo.aspx的302重定向進行響應。瀏覽器通過執行Page2.aspx的GET來正確響應。當用戶按下PageTwo.aspx上的提交按鈕時,驗證錯誤發生,在我們的例子中,safari提交了前一頁視圖狀態的值,pageone.aspx

在我們的例子中,我們通過調用setTimeout ( 「DoWork的()」,10);在window.onload事件中。然後把我們的代碼放在DoWork()函數中。

我們已向蘋果公司提交了一份錯誤報告。

希望這會有所幫助。

0

首先,它是一個反模式,具有大視圖狀態(即讓頁面處理狀態在回發中)。當存在視圖狀態MAC問題時,它與無法解密返回的視圖狀態有關。不知道Safari的safari是否會這樣做(很可能,因爲我認爲它是相同的代碼庫),但在Mac上的視圖狀態是面向PC的瀏覽器的視圖狀態的四分之一(1K與4k)。

限制viewstatein配置的大小將只適用於如果你實際上可以限制大小,並仍然有你的應用程序工作。而且你必須在1K窗口內進行限制(注意,這並不意味着viewstate == 1K,因爲可能還有其他東西被提交)。

更好的解決方案是弄清楚你在視圖狀態下的狀態,並確定是否可以在服務器端重新綁定,而不是依賴視圖狀態來自動重新綁定。有一個可以使用的SessionPageStatePersister。

簡短的答案是你將不得不重新設計一點才能通過這個。

1

如果在OSX上,請嘗試確保「Block Cookies:Always」單選按鈕是而不是被選中。你可以找到它的偏好的隱私標籤...

+0

這仍然是在2016年的問題,並在手機上固定它我們無需更改任何編碼這個簡單的配置設置。在Android和Windows 10 Mobile上運行時沒有任何問題。只有iPhone像這樣粘貼cookie。 – Neville 2016-07-28 13:03:02