‘Validation of viewstate MAC failed’ Hatasının Çözümü

‘Validation of viewstate MAC failed’ hatasi aynı sayfada uzun süre bekledikten sonra, sayfayı tetikleyen bir kontrole tıklandığında ortaya çıkmaktadır. Sayfanının post back işlemi sonrasında viewstate nesnesinden kaynaklanan aşağıdaki hata ekranı çıkmaktadır.

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.”

Bu hata sonucu internette yaptığım araştırmada farklı çözüm yolları buldum. Bende aşağıdaki çözüm yollarından sonuncusu işe yaradı. Sizde kendi kodlarınızda aşağıdaki çözümleri deneyerek umarım uygun olanı bulursunuz.

Çözüm Yolları:

1- Web.config içersinde System.Web içersine aşağıdaki kodların eklenmesi:

 <pages enableeventvalidation="false" viewstateencryptionmode="Never">  

 

2- Bir diğer metod ise formun disabled olarak işaretlenmesi ve load işlemi tamamlandığında script’le enable hale getirilmesidir:

 function enableForm()   
  {   
    document.getElementById("form").disabled = false;   
  }   
  window.onLoad = enableForm();  

Yada form elementlerinin herbirini disable olarak işaretleyip, load işlemi tamamlandığında elementlerin enable hale getirilmesidir:

 function disableElements(elements)   
 {   
  for (var i = elements.length - 1; i >= 0; i--)   
      {   
        var elmt = elements[i];   
        if (!elmt.disabled)   
      {   
              elmt.disabled = true;   
        }   
        else   
      {   
              elmt._wasDisabled = true;   
        }   
       }   
 }   
 function disableFormElements()   
 {   
  disableElements(_form.getElementsByTagName("INPUT"));   
  disableElements(_form.getElementsByTagName("SELECT"));   
  disableElements(_form.getElementsByTagName("TEXTAREA"));   
  disableElements(_form.getElementsByTagName("BUTTON"));   
  disableElements(_form.getElementsByTagName("A"));   
 }   
 function enableElements(elements)   
 {   
  for (var i = elements.length - 1; i >= 0; i--) {   
   var elmt = elements[i];   
   if (!elmt._wasDisabled) {   
    elmt.disabled = false;   
   }   
   else {   
    elmt._wasDisabled = null;   
   }   
  }   
 }   
 function enableFormElements()   
 {   
  enableElements(_form.getElementsByTagName("INPUT"));  
  enableElements(_form.getElementsByTagName("SELECT"));  
  enableElements(_form.getElementsByTagName("TEXTAREA"));  
  enableElements(_form.getElementsByTagName("BUTTON"));  
  enableElements(_form.getElementsByTagName("A"));  
 }   

_form değişkeninin sayfada ASP.net form olarak ayarlandığından emin olun. Sonra sadece enableFormElements() ve disableFormElements() fonksiyonlarını çağırın.

3- Bir diğer method ise sayfanın Render Event’i override yaparak, formun üst kısmında Encrypted Viewstate and Event validation için saklı alan oluşturmaktır. Bu sayfanın gönderilmesinden önce bu olayların yazılmasını sağlayacaktır:

 protected override void Render(System.Web.UI.HtmlTextWriter writer)  
 {  
  System.IO.StringWriter stringWriter =   
    new System.IO.StringWriter();  
  HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);  
  base.Render(htmlWriter);  
  string html = stringWriter.ToString();  
  string[] aspnet_formelems = new string[5];  
  aspnet_formelems[0] = "__EVENTTARGET";  
  aspnet_formelems[1] = "__EVENTARGUMENT";  
  aspnet_formelems[2] = "__VIEWSTATE";  
  aspnet_formelems[3] = "__EVENTVALIDATION";  
  aspnet_formelems[4] = "__VIEWSTATEENCRYPTED";  
  foreach (string elem in aspnet_formelems)  
  {  
   //Response.Write("input type=""hidden"" name=""" & abc.ToString & """")  
   int StartPoint = html.IndexOf("<input type=\"hidden\" name=\"" +   
    elem.ToString() + "\"");  
   if (StartPoint >= 0)  
   {  
    //does __VIEWSTATE exist?  
    int EndPoint = html.IndexOf("/>", StartPoint) + 2;  
    string ViewStateInput = html.Substring(StartPoint,   
     EndPoint - StartPoint);  
    html = html.Remove(StartPoint, EndPoint - StartPoint);  
    int FormStart = html.IndexOf("<form");  
    int EndForm = html.IndexOf(">", FormStart) + 1;  
    if (EndForm >= 0)  
     html = html.Insert(EndForm, ViewStateInput);  
   }  
  }  
  writer.Write(html);  
 }  

4- Yukarıdaki 3. çözümü temel alan bir diğer çözüm ise BasePage adında bir sınıf oluşturarak, sayfanızı page sınıfı yerine BasePage sınıfından türetmektir:

 public class BasePage : Page  
 {  
  private static string[] aspNetFormElements = new string[]   
  {   
   "__EVENTTARGET",  
   "__EVENTARGUMENT",  
   "__VIEWSTATE",  
   "__EVENTVALIDATION",  
   "__VIEWSTATEENCRYPTED",  
  };  
  protected override void Render(HtmlTextWriter writer)  
  {  
   StringWriter stringWriter = new StringWriter();  
   HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);  
   base.Render(htmlWriter);  
   string html = stringWriter.ToString();  
   int formStart = html.IndexOf("<form");  
   int endForm = -1;  
   if (formStart >= 0)  
    endForm = html.IndexOf(">", formStart);  
   if (endForm >= 0)  
   {  
    StringBuilder viewStateBuilder = new StringBuilder();  
    foreach (string element in aspNetFormElements)  
    {  
     int startPoint = html.IndexOf("<input type=\"hidden\" name=\"" + element + "\"");  
     if (startPoint >= 0 && startPoint > endForm)  
     {  
      int endPoint = html.IndexOf("/>", startPoint);  
      if (endPoint >= 0)  
      {  
       endPoint += 2;  
       string viewStateInput = html.Substring(startPoint, endPoint - startPoint);  
       html = html.Remove(startPoint, endPoint - startPoint);  
       viewStateBuilder.Append(viewStateInput).Append("\r\n");  
      }  
     }  
    }  
    if (viewStateBuilder.Length > 0)  
    {  
     viewStateBuilder.Insert(0, "\r\n");  
     html = html.Insert(endForm + 1, viewStateBuilder.ToString());  
    }  
   }  
   writer.Write(html);  
  }  
 }  

5- Bende de çözüm sağlayan yol ise “<machineKey> Generator Tool” kullanarak machineKey elementini Web.config’de, <system.web> elementine eklemektir:

 <machineKey validationKey="B74B4D90C95A2D55EB91C92D679EDF493706FBA967A47CFE424216381C08F5E51F71F5972FA8AD3DEB052CF7AE81526DF90DE9F9FB587BA7A189380CC5A69D1A" decryptionKey="5842BCF01CD711850026B5105290A350A423864F037523892CAF4B25FD44B27C" validation="SHA1" />  

Bu makalede aşağıda yer alan kaynaklardan dolaylı veya direkt olarak faydalanılmıştır. Aşağıda yer alan kaynaklarında incelenmesi faydalı olacaktır.

Kaynaklar:

http://www.osmankurt.net/post/2011/04/05/validation-of-viewstate-mac-failed-hatasc4b1.aspx

https://stackoverflow.com/questions/5840899/asp-net-validation-of-viewstate-mac-failed

https://blogs.msdn.microsoft.com/tom/2008/03/14/validation-of-viewstate-mac-failed-error/

İlk yorum yapan olun

Bir yanıt bırakın

E-posta hesabınız yayımlanmayacak.


*