Прежде всего давайте начнем с того, что эта ошибка состояния просмотра происходит на PostBack .
Также я должен сказать , что я сделал все, что каждый из них предлагает , чтобы избежать этой проблемы. И у меня есть одна машина, но 2 пула, которые работают с одинаковыми страницами.
Итак, кто-то совершает действие , вводит в эфир человека, ищет какой-то другой поисковик, «нажимая» на ваши страницы, или какой-то хакер пытается проверить вашу систему на наличие проблем ...
У меня есть похожие проблемы (редкие, но уже существующие), и я наконец-то обнаружил, что люди пытаются взломать мои страницы. (с того же IP у меня и дос атакует)
Я изменяю функцию LoadPageStateFromPersistenceMedium () , которые переводят состояние просмотра и просматривают, регистрируя, что именно было входом, и с каких IP-адресов ... затем я начал отслеживать эти результаты и увидите, что состояние просмотра было изменено вручную - или было полностью пустым.
При ошибке я просто перенаправляю его на ту же страницу ...
Вот что я сделал ...
public abstract class BasePage : System.Web.UI.Page
{
protected override object LoadPageStateFromPersistenceMedium()
{
try
{
.. return the base, or make here your decompress, or what ever...
return base.LoadPageStateFromPersistenceMedium();
}
catch (Exception x)
{
string vsString = Request.Form[__VIEWSTATE];
string cThePage = Request.RawUrl;
...log the x.ToString() error...
...log the vsString...
...log the ip coming from...
...log the cThePage...
// check by your self for local errors
Debug.Fail("Fail to load view state ! Reason:" + x.ToString());
}
// if reach here, then have fail, so I reload the page - maybe here you
// can place somthing like ?rnd=RandomNumber&ErrorId=1 and show a message
Responce.Redirect(Request.RawUrl, true);
// the return is not used after the redirect
return string.Empty;
}
}
Вторая причина
Теперь есть еще одна причина, по которой это может произойти, и причина в том, что кто-то одним щелчком мыши на вашей странице загружает __EVENTVALIDATION.
Это событие Validation помещается на последнюю кнопку, даже если asp.net обнаружил, и если у вас есть некоторые из них на многих местах на странице или рядом с кнопкой, то это переходит в конец страницы.
Так что, даже если вы видите состояние просмотра в верхней части страницы, где находится проверка ??? может быть, это никогда не загружалось - страница повреждена?, слишком быстрый пользователь нажимает на страницу?
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" ... >
Чтобы избежать такого рода проблем, я сделал простой javascript, который не позволяет нажимать кнопку, если этот вход не был загружен !!!.
Еще один комментарий, __EVENTVALIDATION не всегда представляет! поэтому, может быть, безопаснее не искать это поле, если вы принимаете общее решение, но сделать трюк на JavaScript, чтобы просто проверить, загружена ли полная страница, или что-то еще, что вы думаете.
Вот мое окончательное решение с jQuery: (обратите внимание, что я проверяю на PageLoad, существует ли проверка событий!). Я разместил это на своих главных страницах.
<script language="javascript" type="text/javascript">
function AllowFormToRun()
{
var MyEventValidation = $("#__EVENTVALIDATION");
if(MyEventValidation.length == 0 || MyEventValidation.val() == ""){
alert("Please wait for the page to fully loaded.");
return false;
}
return true;
}
</script>
protected void Page_Load(object sender, EventArgs e)
{
// I do not know if Page can be null - just in case I place it.
if (Page != null && Page.EnableEventValidation)
{
Form.Attributes["onsubmit"] = "return AllowFormToRun();";
}
}
Вы можете проверить, разместив возле кнопки вашей страницы задержку.
<% System.Threading.Thread.Sleep(5000); %>
Обновление
Сегодня я снова вижу в журнале это сообщение для WebResource, и обнаруживаю, что бот, получающий страницы и , делает все символы в ссылках в нижнем регистре , включая параметры, так что это был один больше причин, чтобы не получить правильную закодированную строку, и выдать сообщение типа Заполнение недопустимо и не может быть удалено.
Надеюсь, это поможет вам больше.