Freigeben über


Invalid viewstate

“ViewState”, ASP.NET’le tanıştığımız ve Türkçe’ye “görsel durum” şeklinde çevirebileceğimiz bir kavramdır. Pek çoğumuz, belki de farkında olmadan, yazdığımız uygulamalarda “ViewState” kullanmışızdır. “ViewState” temelde, bir sayfanın son durumunu, sunucuya gidiş-gelişlerde (postback) muhafaza edebilmemizi sağlar. ASP’de bunu kendi yazdığımız kodlarla sağlayabiliyorduk, ve çok sayıda nesne içeren sayfalarda bu oldukça zahmetli olabiliyordu.

“ViewState”, sayfamızdaki nesneler hakkındaki bu bilgileri, XML formatında ve şifrelenmiş bir şekilde gizli (hidden) bir alanda tutar:

<input type="hidden" name="__VIEWSTATE" value="dDwtNTI0ODU5MDE1Ozs+ZBCF2ryjMpeVgUrY2eTj79HNl4Q=" />

Tahmin edebileceğiniz gibi, sayfada ne kadar çok nesne varsa, bu bilgi de o kadar büyüyecektir. Bu bilgi, her istekte istemciyle sunucu arasında gidip geleceğinden, aşırı büyümesi performans sorunlarına neden olabilmektedir. Ancak bugün bahsedeceğim konu bu değil.

“ViewState”, “default” olarak açık gelir. Yani, herhangi bir sayfada veya bir nesnede bunu kullanmayacaksak bizim kapatmamız gerekir. Dolayısıyla, biz bunu kullandığımızın farkında bile olmadan aşağıdakine benzer hatalarla karşılaşabiliriz:

Server Error in '/' Application.


The state information is invalid for this page and might be corrupted.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Web.HttpException: The state information is invalid for this page and might be corrupted.

Source Error:

 [No relevant source lines]

Source File: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\server\9d854\d9a735\App_Web_qcftt.0.cs Line: 0

Stack Trace:

 [FormatException: Invalid length for a Base-64 char array.]   System.Convert.FromBase64String(String s)   ………[ViewStateException: Invalid viewstate.    Client IP: 192.168.1.17 Port: 2818  User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)  ViewState: /wEPDwUJTOA+MEbtAOBUV/zE/HaGg==  Referer: …  Path: /Default.aspx][HttpException (0x80004005): The state information is invalid for this page and might be corrupted.]   System.Web.UI.ViewStateException.ThrowError(…)   ……

Version Information: Microsoft .NET Framework Version:2.0.50727.3082; ASP.NET Version:2.0.50727.3082

Hata ana hatlarıyla yukarıdaki gibi olacaktır (gereksiz yer kaplamasın diye oldukça kısalttım). Ancak neden farklı şeyler olabilir. Aşağıdaki makalelerde olası nedenleri ve herbiri için çözüm önerilerini bulabilirsiniz:

Troubleshooting the "View state is invalid" error with ASP.NET
https://support.microsoft.com/?id=829743

Intermittent Invalid Viewstate Error in ASP.NET Web pages
https://support.microsoft.com/kb/555353

Geçtiğimiz günlerde, bu iki makalede anlatılanlar dışında bir nedenle daha karşılaştım: Sorun sadece bazı istemci makinelerinde ortaya çıkıyordu. Çeşitli araçlarla (NetMon) hem istemci tarafında hem de sunucu tarafındaki ağ trafiğini dinleyip incelediğimizde, ilk istekte sunucudan gelen “ViewState” ile, sonraki istekte istemcinin geri gönderdiği arasında farklar olduğunu tespit ettik. Bu tür durumlara genelde tarayıcılardaki bazı “add-on”ların veya istemci makinesindeki firewall/antivirüs gibi uygulamaların neden oluyordur. Ancak tüm olasılıkları tek tek elediğimiz halde sorun devam ediyordu.

Son olarak, network uzmanı bir arkadaşımdan yardım istedik ve bize istemcinin network kartı sürücüsünde bir sorun olabileceğini söyledi. Nitekim ilgili sürücüyü güncellediğimizde sorun çözüldü.

CENK ISCAN

Comments

  • Anonymous
    November 22, 2012
    İşe yaramaz :D
  • Anonymous
    November 22, 2012
    Fazla basit kalmış.Çözümün yakınından geçmiyor sanki.