none
С чем связана ошибка "Validation of viewstate MAC failed"? RRS feed

  • Вопрос

  • Здравствуйте!

    Разместил сайт(C#, ASP.NET 3.5) на winhost.com и довожу его до ума. Иногда в браузере выкидывает ошибку (см.ниже). Чем она вызвана? Может ли она возникать из-за того, что я часто обновляю сайт и новые страницы конфликтуют со старыми их версиями, котрые хранятьтся в кэше? Заранее спасибо за ответ.

    System.Web.HttpException: 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.

    13 июня 2011 г. 22:27

Ответы

  • 1.Все-таки попробуй EnableViewStateMac="false". Если причина в нем, попробуй прописать в конфиге machineKey

    2. Часто случается, что автор всего двух сообщений запостивший в тему ответ спустя почти год после окончания активного обсуждения бывает не совсем точен. )))

    • Помечено в качестве ответа aaa75 17 июня 2011 г. 0:02
    15 июня 2011 г. 3:58
    Модератор

Все ответы

  • Вот здесь обсуждали вашу проблему.

     

    • Предложено в качестве ответа Dmitry Pavlov 14 июня 2011 г. 6:26
    14 июня 2011 г. 4:10
    Модератор
  • Спасибо за ссылку. На этом сайте нашел совет сделать так:

     **************************************************************************************************************************************

    не стоит отключать такие вещи, если не хотите открыть свой сайт для атак:)
     
    просто надо запретить постбеки пока не загрузилась страница (в случае если у вас не вебфарм то вероятная причина ошибки - это то, то hidden field __EVENTVALIDATION еще не загрузился в страницу, поэтому в посте нет этого поля, и страница не проходит валидацию).
     
     Page.ClientScript.RegisterClientScriptBlock(this.G​­etType(), "reset_page_load", "var _page_loaded = false;", true);
      Page.ClientScript.RegisterStartupScript(this.GetTy​­pe(), "set_page_load", "_page_loaded = true;", true);
      Page.ClientScript.RegisterOnSubmitStatement(this.G​­etType(), "global_submit", "if(!_page_loaded){alert('Please wait for page load');return false;}");
     

    **************************************************************************************************************************************

    я сделал так:

     

    protected void Page_Load(object sender, EventArgs e)
      {
        Cargas_Descargas_info();
        // Validation of viewstate MAC failed http://www.gotdotnet.ru/forums/4/102213/
        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "reset_page_load", "var _page_loaded = false;", true);
        Page.ClientScript.RegisterStartupScript(this.GetType(), "set_page_load", "_page_loaded = true;", true);
        Page.ClientScript.RegisterOnSubmitStatement(this.GetType(), "global_submit", "if(!_page_loaded){alert('Please wait for page load');return false;}");
     
      }
    Однако все равно продолжает выкидывать эту ошибку. Отключать валидацию выглядит вроде как неразумно, базируясь на вышеприведнной цитате. Есть ли какие-то другие способы борбы с этой ошибкой? Спасибо.
    14 июня 2011 г. 22:44
  • 1.Все-таки попробуй EnableViewStateMac="false". Если причина в нем, попробуй прописать в конфиге machineKey

    2. Часто случается, что автор всего двух сообщений запостивший в тему ответ спустя почти год после окончания активного обсуждения бывает не совсем точен. )))

    • Помечено в качестве ответа aaa75 17 июня 2011 г. 0:02
    15 июня 2011 г. 3:58
    Модератор
  • Спасибо. Попробую.

    Только вот хозяева хостинга говорят, что они не используют   Web Farm. В этом случае, поможкт ли   machineKey ? Причины названные хозяевами хостинга тоже вроде не должны быть. Мое приложение вроде очень скромное по ресурсам: http://www.business-proposition.com/  

     

    Вот ответ от хостинга:

    Your hosting account is not hosted on a Web Farm or cluster. The reason you receive this error is because your application is reaching one of the following imposed limits:



    We host each website in its unique application pool / process. To ensure server stability we recycle the application if any of the following conditions are met:



    1) More than 20 minutes of idle time (no http request in 20 minutes)

    2) The application uses more than 100 MB memory

    3) The application uses more than 70% of CPU resources for more than 3.5 minutes

    15 июня 2011 г. 14:59
  • Получил ответ от хостинга(см.ниже). Они говорят, что эта ошибка связана с тем, что мое приложение ззпнимет больше чем 100 Мв серверной памяти. Может ли это быть в действительности? Мои страницы по размеру не превосходят 20кб. Картинки- около 100кб. Да есть обращение и работа с   БД.  Но  эта проблема возникает например при регистрации пользователя(http://www.business-proposition.com/Registracion.aspx), где я использую элемент  CreateUserWizard, т.е. хочу сказать, что вряд ли код написанный Макрософт так прожорлив.  Может ли эта ошибка вызванна низкой скоростью моего Интернета?  Заранее спасибо за идеи и ответы. 

    I checked our servers event log and I found numerous entries where you application reached the 100 MB memory threshold.

    A worker process with process id of '74228' serving application pool 'customerPool_13735' has requested a recycle because it reached its private bytes memory limit.

    Because your application started to consume more than 100 MB of the servers memory your application pool was recycled which made you lose your viewstate.

    If your application requires more than 100 MB of the servers memory, you may want to consider upsizing your plan to the Max plan where you will be afforded 200 MB of the servers memory.  Another alternative is to optimize your application so that it does not consume more then 100 MB of the servers memory.

    15 июня 2011 г. 17:27
  • Не знаю, поможет или нет, но что мешает попробовать?

    Минут 5 гонял сайт, ни одной ошибки не вылетело...

    16 июня 2011 г. 3:57
    Модератор
  • ulcer, cпасибо за помощь. Чесно говоря пока еще не разобрался с  machineKey. Кажеться это не совсем просто.  Однако это возможное решение.   Второе направление, что я вижу, это опитимизировать код, если действительно мое приложение так прожорливо как говорит сисадмин хостинга. 

    Поэтому хочу воспользоваться возможностью пообщаться с продвинутым человеком и попросить консультацию: Подскажте пожалуста, подключения к базе надо зарывать ручками или оно закрывается по умолчанию после окончания вызова подпрограммы?  Пример моей работы с БД  см.ниже. Я думаю, может я некорректно работаю с БД и это так жрет память (?). Заранее спасибо.     

      protected void Save_data_personal()
      {
        DataClasses_ArlyDataContext db1 = new DataClasses_ArlyDataContext();//sosdanie obekta-posrednika megdy BD i Formou(str.866, begin_c_sharp2008.djvu)
    
        var cust =
         (from c in db1.Table_datos_personals
          where c.NickName == LoginName1.Page.User.Identity.Name
          select c).FirstOrDefault();
    
        if (cust != null)
        {
          db1.Table_datos_personals.DeleteOnSubmit(cust);
          db1.SubmitChanges();
        }
    
        int autoriz = 0;
        
        Table_datos_personal ob1 =//sosdanie obekta dla sapisi v BD
             new Table_datos_personal 
             {
               NickName=LoginName1.Page.User.Identity.Name,  
               Email=TextBox_email.Text,
                 L_trabajo=TextBox_L_trabajo.Text,
                 FIO=TextBox_nombre.Text,
                 Area_interes=TextBox_Interes.Text,
                 Autorisacion=autoriz,
                 Coment_Admin=""        
             };
        db1.Table_datos_personals.InsertOnSubmit(ob1);
        db1.SubmitChanges(); 
      }

    17 июня 2011 г. 0:16