c# - viewstate範例 - viewstate缺點




.NET應用程序中出現不穩定的無效Viewstate問題 (7)

我好像在我的ASP.NET應用程序的事件查看器中不時出現“無效的viewstate”。

他們中的大多數(95%)似乎是引用ScriptResource.axd (應用程序使用ASP.NET AJAX庫)。 我無法移除Ajax庫,因為無處不在使用Ajax ..

我怎樣才能減少這些錯誤? 我每天發生100-200個錯誤,我不知道如何解決它們! 它們來自不同的瀏覽器,不同的IP和地理位置。

我很難重現這個問題,因為它幾乎沒有發生在我身上,它只發生在我以外的3-4次。

錯誤:

Process information: 
    Process ID: 4004 
    Process name: w3wp.exe 
    Account name: NT AUTHORITY\NETWORK SERVICE 

Exception information: 
    Exception type: HttpException 
    Exception message: Invalid viewstate. 

Request information: 
    Request URL: http://domainnamehere/ScriptResource.axd?d=W1R6x9VzZ2C9SKnIkOmX9VRLhSjJ3nOF1GSQvPwKS3html 
    Request path: /ScriptResource.axd 
    User host address: 124.177.170.75 
    User:  
    Is authenticated: False 
    Authentication Type:  
    Thread account name: NT AUTHORITY\NETWORK SERVICE 

Thread information: 
    Thread ID: 1 
    Thread account name: NT AUTHORITY\NETWORK SERVICE 
    Is impersonating: False 
    Stack trace:    at System.Web.UI.Page.DecryptStringWithIV(String s, IVType ivType)
   at System.Web.UI.Page.DecryptString(String s)
   at System.Web.Handlers.ScriptResourceHandler.DecryptParameter(NameValueCollection queryString)
   at System.Web.Handlers.ScriptResourceHandler.ProcessRequestInternal(HttpResponse response, NameValueCollection queryString, VirtualFileReader fileReader)
   at System.Web.Handlers.ScriptResourceHandler.ProcessRequest(HttpContext context)
   at System.Web.Handlers.ScriptResourceHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext context)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)


Custom event details: 

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

我也偶爾會在我的.NET代碼中發現這個錯誤,這些錯誤可能與此相關:

Exception raised in GLOBAL.ASAX.Application_Error(): 'Padding is invalid and cannot be removed.' at System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
   at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
   at System.Security.Cryptography.CryptoStream.FlushFinalBlock()
   at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo)
   at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)

Viewstate問題煩人而令人沮喪 - 我注意到有幾個人在這個主題中討論過Viewstate問題。 所以,這裡有一些建議你可以看看。

  1. 我會回應弗雷迪里奧斯已經在線上說過的話。 確保你已經對機器密鑰進行了硬編碼。 這將解決絕大多數這些問題。 ScriptResource鏈接的重要之處在於它應該有查詢字符串中的廣告參數和參數。 如果它沒有其他錯誤!

  2. 不要讓用戶回复,直到完成。 你可以用javascript和一些CSS來做到這一點。 從內存中,我認為有一種方法可以用meta標籤來做到這一點,但它可能只是IE。

  3. 我會著眼於早期的回應。 我會認為腳本管理員會是最好的。 但是你可能需要嘗試一下。

  4. 如果您的viewstate看起來很臃腫,請在IIS中打開GZip壓縮。

  5. 如果您的視圖狀態變得非常臃腫,並且您無法開啟GZip壓縮功能,或者它有不良副作用。 然後你可以壓縮和解壓視圖狀態。 http://www.codeproject.com/KB/viewstate/ViewStateCompression.aspx

  6. 如果這仍然讓你的視圖狀態變得臃腫,你可以考慮在本地存儲視圖狀態。 http://blog.arctus.co.uk/articles/2007/04/23/advanced-asp-net-storing-viewstate-in-a-database/是一個很好的起點。


Viewstate太大時,我看到過這樣的問題。 由於弗雷迪描述的問題,我已經看到了它的發生。

我通常不喜歡使用Viewstate的想法。 你能完全關閉Viewstate嗎?


使用固定的機器密鑰(即使在做單台服務器時)。

使用機器密鑰的自動配置時會出現問題,每次應用程序域被回收時都會得到一個新的問題。 這會影響視圖狀態驗證,動態資源查詢字符串解密和認證票據[插入機器密鑰的其他用途]。


我也遇到了這個問題,並且我已經嘗試了所有我發現的博客中提到的所有內容(固定機器密鑰,視圖狀態大小等)。 99%的錯誤記錄在ScriptResource.axd的請求上。 我在Win 2003服務器上使用.net 3.5 SP1。 該應用程序託管在兩個平行相同的服務器上,平衡50/50。 每台服務器都有相同的機器密鑰。

通常這個錯誤對我來說並不重要,然而,在3個月的時間裡,發生的趨勢一直在上升。

有沒有人認為這個錯誤與Viewstate沒有被UrlEncoded / HtmlEncoded或UrlDecoded正確相關。 也許在視圖狀態中有一些字符子集,一些瀏覽器正在用一些編碼值替換。 我不確定這是否有道理。


我想你正在使用ASP.NET AJAX。 我有同樣的問題。 偶爾我會在我的事件日誌中發現這個異常,並且請求的路徑是ALWAYS ScriptResource.axd。

在machineKey中使用固定的validationKey和decryptionKey並沒有解決我的問題。

基於我能夠收集的內容,我傾向於認為這個錯誤與ViewState無關; 我的理論是,出於某種原因,某些UA以某種方式混淆了ScriptResource.axd的“d”參數。 通過手動請求違規路徑,該問題很容易複製。 這會產生一個“Invalid ViewState”異常,即使ViewState甚至不適用於此。

挖掘我的日誌,我發現例如:

此請求已成功(200):/ ScriptResource.axd?d=oFCAB7_vUyp7Hhe9lxZBz37lpoAxhfbWwwdfFy3Zd3z41W_33Y_9Dq6i10g9Q1NRCY1n0_DNg1nE6-DDbsD6r4EiuwoeDzp9mjDDfBNLb1k1&t=41df03cc

這個稍微不同的請求也會提供OK(200):/ ScriptResource.axd?d=oFCAB7_vUyp7Hhe9lxZBz37lpoAxhfbWwwdfFy3Zd3z41W_33Y_9Dq6i10g9Q1NR5ijsxQts4AfbJdACRwmQ8sHt6UAzui3spEnooPneTz01&t=41df03cc

此請求因500響應和無效ViewState異常而失敗: /ScriptResource.axd?d=oFCAB7_vUyp7Hhe9lxZBz37lpoAxhfbWwwdfFy3Zd3z41W_3 products $ ctl00 $ AddToCart1 $ id

如果仔細觀察,所有三個請求中的前幾個字符都是相同的,但最後一個請求的最後幾個字符(粗體)顯然是Control ID“products $ ctl00 $ AddToCart1 $ id”(我有一個控件命名為products和AddToCart)。 我不知道這個ID如何到達那裡,但在我的情況下,這是什麼導致所有這些無效的ViewState異常。

我不確定這是否與OP相同,但我注意到Martin的請求URL以“html”結尾,這對於一個應該是關鍵字的參數來說有點巧合。

由於這個問題,我已經頭疼了。 到目前為止,我遇到的最有見地的帖子是這一個http://bytes.com/topic/asp-net/answers/861764-invalid-viewstate-system-string-decryptstringwithiv

任何見解?


我想,你必須在aspx頁面中使用:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

這解決了我的問題


這個問題似乎是IE8中的向前看下載器。

它似乎只影響IE8在一個相當模糊的情況下。 可以忽略的原因之一是,附加到URL的4k數據塊經常被服務器丟棄。 似乎更有可能的事情之一是網絡連接速度很慢。 下列其中一位資源中的某位人士指出,他僅在新西蘭與其客戶有過問題。

很多人解釋兩個單獨的問題,其中一個在上面的問題中描述(發送到服務器的格式不正確的URL):

http://connect.microsoft.com/VisualStudio/feedback/details/434997/invalid-webresource-axd-parameters-being-generated

文章解釋說,前瞻下載器是固定的:

http://blogs.msdn.com/b/ieinternals/archive/2010/04/01/ie8-lookahead-downloader-fixed.aspx

KB980182 - 修復了哪個問題的累積更新:

http://support.microsoft.com/kb/980182

注意:因為如果腳本無法通過lookahead下載程序檢索到,腳本會自動重新下載,所以應該可以更改回舊的驗證模式,其中.axd文件未檢查其有效性並刪除問題:

<httpRuntime requestValidationMode="2.0" />






viewstate