2013-10-14 3 views
2

В наших файлах журналов я обнаружил следующее исключение. (ASP.NET, Sitecore 6.6). Любые идеи, почему это происходит?Исключение Viewstate Проверка отказа MAC-адреса ViewState

Я ссылался на this post. Мое приложение не находится в ферме серверов. Также это не происходит с каждой обратной передачей.

7776 02:11:53 ERROR Application error. 
Exception: System.Web.HttpException 
Message: 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. 
Source: System.Web 
at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) 
at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString, Purpose purpose) 
at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter2 formatter, String serializedState, Purpose purpose) 
at System.Web.UI.HiddenFieldPageStatePersister.Load() 
at System.Web.UI.Page.LoadPageStateFromPersistenceMedium() 
at System.Web.UI.Page.LoadAllState() 
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
at System.Web.UI.Page.ProcessRequest() 
at System.Web.UI.Page.ProcessRequest(HttpContext context) 
at System.Web.UI.Page.ProcessRequest(HttpContext context) 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

Nested Exception 

Exception: System.Web.UI.ViewStateException 
Message: Invalid viewstate. 
Client IP: xxx.xxx.xxx.201 
Port: <PORT> 
Referer: <URL> 
Path: /<PAGE> 
User-Agent: Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11 
ViewState: /wEPDwUJMzY0OTY5Mjg5D2QWAgIFEGRkFgQCAw9kFgJmD2QWAmYPZBYCAg4PZBYCZg9kFgQCAw8PFgQeFUN1cnJlbnRTZWxlY3Rpb25WYWx1ZQUkMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwHhRDdXJyZW50U2VsZWN0aW9uVGV4dAUVQWxsIENhdGVnb3JpZXMgKDY5NTEpZBYCAgEPZBYCZg9kFgICAQ8UKwACDxYGHgRUZXh0BRVBbGwgQ2F0ZWdvcmllcyAoNjk1MSkeBF8hU0ICAh4IQ3NzQ2xhc3MFB1Rvb2xCYXJkEBYBZhYBFCsAAmRkDxYBZhYBBXdUZWxlcmlrLldlYi5VSS5SYWRDb21ib0JveEl0ZW0sIFRlbGVyaWsuV2ViLlVJLCBWZXJzaW9uPTIwMTIuMi42MDcuMzUsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MTIxZmFlNzgxNjViYTNkNBYCAgIPFCsAAWQWAgIBDxQrAAIUKwACFCsAAg8WBB8EBQdUb29sQmFyHwMCAmQPFCsAARQrAAIPFgYfAgUVQWxsIENhdGVnb3JpZXMgKDY5NTEpHgVWYWx1ZQUkMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwHghTZWxlY3RlZGdkZA8UKwEBZhYBBXNUZWxlcmlrLldlYi5VSS5S... 

ответ

4

пожалуйста, проверьте этот link

Корневая причина появляется Это исключение, потому что элементы управления с использованием DataKeyNames требует ViewState быть зашифрованы. Когда Viewstate зашифрован (режим по умолчанию, Auto, должен шифроваться, если контроль требует этого, в противном случае - нет), страница добавляет поле непосредственно перед закрытием тега. Но это скрытое поле могло бы не отображаться в браузере с длинными страницами, и если вы сделаете обратную передачу до этого, браузер инициирует обратную передачу без этого поля (в форме post collection). Конечным результатом является то, что если это поле опущено при обратной передаче, страница не знает, что Viewstate зашифрована и вызывает вышеупомянутое исключение. И.Е. страница будет полностью загружена, прежде чем вы сделаете обратную передачу.

И, кстати, подобная проблема связана с проверкой событий, так как поле __EVENTVALIDATION также отображается в конце формы. Это функция безопасности, которая гарантирует, что действия обратной передачи происходят только из событий, разрешенных и созданных сервером, чтобы предотвратить ложную обратную передачу. Эта функция реализуется путем управления событиями, которые регистрируют действительные события при их рендеринге (как и во время их реальных методов Render()). Конечным результатом является то, что в нижней части вашего отображаемого тега вы увидите что-то вроде этого:. Когда происходит обратная передача, ASP.NET использует значения, хранящиеся в этом скрытом поле, чтобы убедиться, что нажатая кнопка вызывает действительное событие. Если это неверно, вы получите исключение выше.

Проблема возникает, когда вы отправляете сообщение после того, как поле EventValidation было отображено. Если EventValidation включен (по умолчанию это он), но ASP.net не видит скрытого поля при обратной передаче, вы также получаете исключение. Если вы отправляете форму до того, как она будет полностью отображена, то вероятность того, что поле EventValidation еще не было отображено, и, таким образом, ASP.NET не может подтвердить ваш клик.

Обходные 1. Установите EnableEventValidation ложь и viewStateEncryptionMode значение Никогда следующим образом:

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

0

У меня аналогичная проблема в моем недавнем project.When я пытался найти некоторую помощь от Google, то, что большинство людей обсуждавшиеся являются следующие

Добавление ключа машины в web.config

<system.web> <machineKey validationKey="..." decryptionKey="..." validation="SHA1" /> </system.web>

Set EnableViewStateMAC = False в web.config

<system.web> <pages enableViewStateMac="False"/> </system.web>

Но все вышеизложенное решение не сработало для меня. Всякий раз, когда я пытаюсь открыть приложение с IP-адресом, он отлично работает, но если я попробовал открыть приложение с именем домена, он показал мне ошибку «ViewState MAC failed». Я копаю, чтобы узнать, что проблема, и , наконец, я нашел решение, эта ошибка возникает, когда браузер не принимает cookie с сервера.

Godaddy предоставляет функцию пересылки доменов с помощью маскировки. Один из моих коллег установил эту функцию в нашем домене приложений, IE и Safari имеют уровень безопасности, что они не принимают файлы cookie от третьих сторон и рекламодателя, поэтому оба эти браузера генерируют ошибку «ViewState MAC failed».

Вы можете установить уровень безопасности, чтобы принять все файлы cookie в IE Инструменты> Свойства обозревателя> Конфиденциальность и Переместить нижний ползунок настройки для значения «Принять все файлы cookie».

Надеюсь, что это решение поможет другим выйти из устаревшей ошибки asp.net "ViewState MAC failed".

Смежные вопросы