Почему я только * случайным образом * получаю ошибку проверки MAC состояния просмотра в среде с одним сервером?

Да, есть миллион вопросов и тем по этой конкретной ошибке, с множеством хорошо задокументированных решений, которые я обязательно попробую. Но сначала я хочу понять проблему для моей конкретной ситуации / среды.

В моей ситуации эта ошибка кажется совершенно случайной. Я буду неделями не видеть его, а потом однажды я войду на свой сайт и получу сообщение об ошибке. Обновите страницу, войдите снова, и никаких проблем. В течение этих периодов между инцидентами с веб-сервером ничего особенного не происходило.

И еще одна вещь, ошибка говорит: «Если это приложение размещено на веб-ферме или кластере ...», но это не так. Это всего лишь один-единственный Windows Server 2008.

Итак, я понимаю, что общее решение - добавить набор статических машинных ключей в файл web.config, но почему это происходит случайно, и почему это происходит с моим сайтом, который находится на одном Windows Server 2008 машина?

Я использую ASP.NET 4, и мой сайт представляет собой веб-приложение, работающее на IIS.

Сообщение об ошибке:

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.

Трассировка стека:

[ViewStateException: Invalid viewstate. 
    Client IP: ##::##:##:##:##
    Port: ##
    Referer: http://myserver/login.aspx
    Path: /login.aspx
    User-Agent: Opera/9.80 (Windows NT 6.1; WOW64; U; en) Presto/2.10.289 Version/12.01
    ViewState: /wEPDw...6OCX]

[HttpException (0x80004005): 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.]
   System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) +235
   System.Web.UI.ViewStateException.ThrowMacValidationError(Exception inner, String persistedState) +14
   System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) +274
   System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState) +4
   System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState) +37
   System.Web.UI.HiddenFieldPageStatePersister.Load() +241
   System.Web.UI.Page.LoadPageStateFromPersistenceMedium() +106
   System.Web.UI.Page.LoadAllState() +43
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +8431
   System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +253
   System.Web.UI.Page.ProcessRequest() +78
   System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) +21
   System.Web.UI.Page.ProcessRequest(HttpContext context) +49
   ASP.login_aspx.ProcessRequest(HttpContext context) +4
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +100
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

person CptSupermrkt    schedule 20.08.2012    source источник
comment
Вы динамически добавляете элементы управления в зависимости от определенных условий?   -  person nunespascal    schedule 20.08.2012
comment
Спасибо за ответ. Нет, я не добавляю никаких элементов управления динамически.   -  person CptSupermrkt    schedule 20.08.2012


Ответы (1)


В вашем журнале я предлагаю вам проверить одну вещь - Подключили ли вы какой-либо параметр вашего пользователя к Viewstate, который можно изменить, если пользователь вошел в систему / вышел из системы? - или изменить для любого другого причина, например потому что сеанс истек или изменен.

Этот параметр может отличаться для сохраненного и текущего состояния просмотра, и это может привести к поломке страницы.

Например, этот код может сделать это:

ViewStateUserKey = CurrentUserCookie;

Или вот этот как есть:

ViewStateUserKey = User.Identity.Name

Также прочтите этот ответ: https://stackoverflow.com/a/2551810/159270

Это похоже на: ViewStateUserKey + общий хостинг + ошибка проверки ViewStateMac

И некоторая ссылка: http://www.hanselman.com/blog/ViewStateUserKeyMakesViewStateMoreTamperresistant.aspx< >
http://msdn.microsoft.com/en-us/library/ms972969.aspx

Случайные ошибки - кошмар любого разработчика.

person Aristos    schedule 20.08.2012