Пользовательские страницы 404 и недопустимые ошибки Viewstate - PullRequest
1 голос
/ 05 января 2011

Как вы все знаете, кажется, что приложения ASP.NET всегда выдают некоторые ошибки Invalid Viewstate, но теперь я действительно нахожу способ воспроизвести их на моем сайте.

То, что происходит, - то, что пользователь пытается получить доступ к странице, которая не существует, и я делаю:

    if (CurrentItem == null) {
        throw new HttpException(404, "Page not found");
    }

Это перенаправит пользователя на нашу пользовательскую страницу 404. Эта страница 404 является просто обычной страницей в нашей системе, на которую мы перенаправляем через web.config. Функция поиска видна на этой странице. Но когда я делаю постбэк с этой страницы, кажется, что произошла ошибка. Так что если вы идете к примеру.

http://alternativeto.net/software/doesntexist

А затем воспользуйтесь формой поиска в правом верхнем углу и введите, например, Dropbox, нажмите ввод (если вы получаете автоматическое предложение, не нажимайте кнопку, потому что он просто свяжет вас с этим приложением), и вы получите ошибка, которая называется «Invalid Viewstate», bla bla.

Кто-нибудь знает, как я могу это исправить? Это потому, что я выбрасываю ошибку 404? Я могу себе представить, что это связано с редиректом на пользовательскую страницу 404, а магия viewstate и asp.net в каком-то смысле недопустима? Может быть, я могу что-то изменить в моем web.config, чтобы исправить это?

Спасибо за любую помощь, которую я могу получить! Конечно, хотите избавиться от как можно большего количества ошибок:)

UPDATE

Похоже, я решил это сам. Когда у MS была эта ошибка безопасности, они рекомендовали изменить перенаправление ошибок на redirectMode = "ResponseRewrite" , когда я изменил его на redirectMode = "ResponseRedirect" , похоже, оно работает нормально!

ОБНОВЛЕНИЕ 2

Но я также понимаю, что я скорее хочу иметь решение ResponseRewrite, так как оно останется на том URL, который получил ошибку, и это намного чище. Поэтому я все равно был бы рад найти решение, которое работает с ResponseRewrite.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

У меня была та же проблема, я думаю, это потому, что использование responseMode="ExecuteURL в <httpErrors> использует Server.Transfer, поэтому URL не изменится, например, с /contact на /404.

Это означает, что действие в главной форме останется как /contact и будет отправлено обратно на эту страницу, но, поскольку мы перешли на /404.aspx, это приведет к неверному состоянию просмотра.

Мое решениебыло установить действие формы при предварительном отображении страниц 404 и 500 к пути запроса вместо RawUrl.

protected void Page_PreRender(object sender, EventArgs e)
{
    var form = (HtmlForm)this.Master.FindControl("Form1");
    if (form != null)
        form.Action = Request.Path;
}

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

0 голосов
/ 05 января 2011

Окно поиска должно ВСЕГДА использовать GET, а не POST (!!).Так что не используйте постбэк для поиска, украсьте текстовое поле с помощью метода method = "get" action = "searchpage", и вы свободны дома, и все ваши посетители будут счастливее

...