Ответ стандартной IIS-страницей 404 Not Found в классе code-behind страницы ASP.NET - PullRequest
2 голосов
/ 26 мая 2011

Я хочу иметь возможность генерировать стандартный ответ 404 IIS, а не пользовательскую страницу 404, в ответ на условие ошибки в классе code-behind.Мой Page_Load метод выглядит следующим образом:

protected void Page_Load(object sender, System.EventArgs e)
{
    this.a = ...
    ...
    if (this.a == null) ... // *** generate a 404
}

Так что, если a не равно нулю, .aspx рендеринг файла и т. Д., Но если a равно нулю, я хочу стандарт "Ресурс не может быть найден " страница для показа с кодом ответа 404.

Если я использую:

if (a == null) Response.StatusCode = 404;

(что является правильным методом в соответствии счто я могу найти) страница продолжает отображаться (и выдает NullReferenceException с кодом ответа 500, когда она пытается использовать a).

Если я использую:

if (a == null) throw new HttpException(404, "Not found");

Код ответа - 404, но содержимое страницы является страницей необработанного исключения ASP.NET, показывающей исключение HttpException (которое затем отображается как общая «Ошибка времени выполнения», если customErrors равно On).

IЯ хочу показать страницу 404 IIS, потому что пользователи это поймут, но они, вероятно, не будут проверять код ответа страницы, если он показывает ошибку сервера.

РЕДАКТИРОВАТЬ : похожеЯ не могу сделать это точно.Учитывая ответ @ Smudge202, я позволил своему программному коду выбросить HttpException и добавил код к Global.Application_Error() для обработки этих исключений:

void Application_Error(object sender, EventArgs e)
{
var exception = Server.GetLastError();

    if (exception is HttpException)
    {
        var httpException = (HttpException)exception;
        if (httpException.GetHttpCode() == 404)
        {
            var context = HttpContext.Current;
            context.Response.Clear();
            context.Response.StatusCode = 404;
            context.Response.StatusDescription = "Not Found";
            context.Response.Write("<h1>404 Not Found</h1>");
            context.Server.ClearError();
        }
    }
    // ...
}

Это позволяет мне установить собственный ответ на исключение.У этого подхода есть два недостатка:

  • Что я действительно хотел сделать, так это вернуть управление обратно в IIS и позволить ему отображать ответ по умолчанию 404, я не могу найти способ сделать это
  • Новый ответ (записанный context.Response.Write()) показан для каждых 404, а не только для тех, которые сгенерированы в коде

Так что, похоже, мне потребуется либо:

  • Из выделенного кода перенаправьте на сделанную на заказ страницу, объясняющую, что «вещь» не может быть найдена (которая также устанавливает код ответа 404), или
  • Установите пользовательскую глобальную страницу 404

Ответы [ 3 ]

1 голос
/ 26 мая 2011

Я сомневаюсь, что это чистое решение, но оно может сработать ...

Если объединить этот пост (и несколько похожих, я уверен). Похоже, глобальный asax, записывающий 404 в поток ответов, обходит пользовательские ошибки.

Имея это в виду, вы можете преднамеренно создать собственное исключение в своем коде. Проверить это пользовательское исключение в Application_Error и ответить 404 оттуда? Это предотвратит рендеринг страницы, и все должно работать так, как вы просили?

EDIT:

Если это показано для каждого исключения 404, и вы не хотите, чтобы оно было, создайте пользовательское исключение для вашего исходного кода, который будет запущен. Только поймать это конкретное исключение в Application_Error, разрешить другим проходить как обычно?

Я также нашел эту ветку , где ОП, как и вы, пытался поднять реальную страницу 404, а не ее макет. Там есть пара предложений о том, как это сделать, не знаю, работает ли какое-либо из них, но, вероятно, стоит попробовать быстро.

1 голос
/ 26 мая 2011

Как насчет перенаправления на несуществующую страницу.

0 голосов
/ 19 октября 2016

@ Бен Скотт, как сказал JNappi, его подход - хорошая работа, основанная на идее JNappi, я думаю, что могу предложить вам одну мысль.

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

Таким образом, вы можете избежать 302 перенаправления сообщения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...