Странное необработанное исключение из приложения asp.net - Проверка состояния отображения MAC перестало работать

Чтобы использовать new для общего типа, вам нужно будет указать ограничение new() для определения вашего класса / метода:

public static E FromModel<T, E>(T other) 
        where T : sysModel
        where E : dbModel, new()

Поскольку вы используете параметр в конструкторе, вы не можете использовать new, но вместо этого вы можете использовать Activator и передать other в качестве аргумента:

public static E FromModel<T, E>(T other)
    where T : sysModel
    where E : dbModel
{
    return (E)Activator.CreateInstance(typeof(E), new[]{other});
}
11
задан Michael Paulukonis 17 August 2012 в 14:52
поделиться

6 ответов

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

Если это верно, ошибка вызывается функцией ASP.net 2.0 под названием Проверка События. Это - средство защиты, которое гарантирует, чтобы действия обратной передачи только прибыли из событий, позволенных и созданных сервером, чтобы помочь предотвратить имитировавшие обратные передачи. Эта опция реализована при наличии допустимых событий регистра средств управления, когда они представляют (как в, во время их фактического Рендеринга () методы). Конечный результат состоит в том, что у основания Вашего представленного тега form, Вы будете видеть что-то вроде этого:

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION"  value="AEBnx7v.........tS" />

Когда обратная передача происходит, ASP.net использует значения, сохраненные в этом скрытом поле, чтобы гарантировать, что кнопка, которую Вы нажали, вызывает допустимое событие. Если это не допустимо, Вы получаете исключение, которое Вы видели.

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

Одна работа вокруг должна, конечно, просто отключить проверку события, но необходимо знать о последствиях безопасности. С другой стороны, просто никогда не отправляйте назад, прежде чем форма закончила представлять. Конечно, это трудно сказать Вашим пользователям, но возможно Вы могли отключить UI, пока форма не представила?

из http://forums.asp.net/p/955145/1173230.aspx

17
ответ дан 3 December 2019 в 02:03
поделиться

@Chris

если проблема нажимает объект, прежде чем страница полностью представила, asp.net, 3,5 SP1 добавили web.config запись на элементе страницы, названном renderAllHiddenFieldsAtTopOfForm.

12
ответ дан 3 December 2019 в 02:03
поделиться

Вы имеете несколько серверов, запускающих это приложение, и/или имеете веб-сад? Если да, Вы оказываетесь перед необходимостью устанавливать машину, вводят web.config

4
ответ дан 3 December 2019 в 02:03
поделиться

Для кого-либо еще заканчивающего, борясь с этой проблемой вот полезная ссылка на некоторую работу arounds:

http://blogs.msdn.com/tom/archive/2008/03/14/validation-of-viewstate-mac-failed-error.aspx

1
ответ дан 3 December 2019 в 02:03
поделиться

По умолчанию ASP.NET включает цифровую подпись значения ViewState на странице. Это делает так с автоматически сгенерированной клавишей, которая удерживается в памяти. Это сделано, чтобы препятствовать тому, чтобы злонамеренный пользователь изменил ViewState от браузера и, например, предоставление сам доступ для наполнения, у них обычно не было бы доступа к.

ASP.NET может также, дополнительно, зашифровать ViewState, но он выключен по умолчанию по причинам производительности. На многих веб-сайтах намного более важно удостовериться, что содержание ViewState 'не унавожено с', чем это должно сохранить это конфиденциальным.

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

Наиболее распространенная причина этой ошибки состоит в том, что Вы используете два или больше веб-сервера в подобной ферме среде: один сервер отправляет исходную страницу, подписанную с ключом в памяти на том сервере, но страница отправляется назад на второе (или треть...) сервер. Поскольку эти два или больше сервера не совместно используют ключ подписи, подписи не соответствуют.

... Если это приложение размещается Веб-фермой или кластером, удостоверьтесь, что конфигурация указывает тот же validationKey и алгоритм проверки. AutoGenerate не может использоваться в кластере.

То, что сообщение об ошибке говорит Вам, должно использовать атрибут validationKey (см. детали в MSDN) в Вашем web.config к hardcode ключ подписи к значению, совместно использованному всеми Вашими серверами, вместо того, чтобы использовать динамично сгенерированный. Тем путем проверка подписи может успешно выполниться, независимо от которого сервер получает обратную передачу.

Вы могли выключить проверку, но очень опасно сделать так. Это означает, что любой хакер с небольшим количеством свободного времени может фальсифицировать значения в Вашем приложении. Например, если Вы сохраняете цену объекта в значении ViewState, хакер мог бы изменить значение от браузера до 0,01$ прямо прежде, чем поместить порядок.

1
ответ дан 3 December 2019 в 02:03
поделиться

Я знаю, что можно отключить Проверку состояния отображения MAC, но я думаю, не загружается ли страница, можно войти в большую проблему. Когда я столкнулся с этой проблемой, я должен был отключить все кнопки, пока страница не была полностью загружена.

0
ответ дан 3 December 2019 в 02:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: