Преобразовать исключение в ответ HTTP 404 в Application_Error - PullRequest
5 голосов
/ 11 мая 2010

Прежде всего, быстро, чего именно я хочу достичь: преобразовать конкретное исключение в HTTP 404, чтобы ASP.NET мог обрабатывать его дальше .

Я обрабатываю исключения в ASP.NET (MVC2) следующим образом:

    protected void Application_Error(object sender, EventArgs e) {
        var err = Server.GetLastError();
        if (err == null)
            return;
        err = err.GetBaseException();

        var noObject = err as ObjectNotFoundException;
        if (noObject != null)
            HandleObjectNotFound();

        var handled = noObject != null;
        if (!handled)
            Logger.Fatal("Unhandled exception has occured in application.", err);
    }

    private void HandleObjectNotFound() {
        Server.ClearError();
        Response.Clear();
        // new HttpExcepton(404, "Not Found"); // Throw or not to throw?
        Response.StatusCode = 404;
        Response.StatusDescription = "Not Found";
        Response.StatusDescription = "Not Found";
        Response.Write("The whole HTML body explaining whata 404 is??");
    }

Проблема в том, что я не могу настроить customErrors по умолчанию для работы с ним. Когда он равен on, он никогда не перенаправляется на страницу, указанную в customErrors: <error statusCode="404" redirect="404.html"/>.

Я также пытался поднять new HttpExcepton(404, "Not Found") из обработчика, но затем код ответа 200, который я не понимаю, почему.

Итак, вопросы:

  1. Как правильно перевести AnException в HTTP 404 ответ?
  2. Как работает секция customErrors при обработке исключений в Application_Error?
  3. Почему HttpException (404) отображает (пустую) страницу со статусом успеха (200)?

Спасибо
Дмитрий.

1 Ответ

2 голосов
/ 03 августа 2010

В двух словах, если вы вручную устанавливаете статус HTTP в Application_Error, вы теряете возможность использовать обработчик раздела customErrors, так как вы вызываете Server.ClearError ().

Обработайте исключение перед Application_Error или извлеките исключение из HttpException.

  • Как правильно преобразовать AnException в ответ HTTP 404?

Лучше обрабатывать исключения в контроллере. Вы можете ввести контроллер базового класса и обработать большинство исключений в пользовательском атрибуте HandleError. Вы можете выбросить HttpException, и он будет корректно обработан обработчиком раздела customErrors.

Вы также можете получить исключение ObjectNotFoundException из HttpException (404)

Application_Error - это последний шанс обработать исключение. У вас есть только Response API, чтобы справиться с этим. Вы можете вручную установить код состояния и записать в ответ или вручную инициировать перенаправление на пользовательскую страницу ошибки или вызвать Server.TransferRequest () для существующего файла HTML или aspx (не для действия контроллера). В текущей версии asp.net вы не можете установить или изменить Server.GetLastError в методе Application_Error, только получить или очистить его.

  • Как работает раздел customErrors при обработке исключений в Application_Error?

Вызывая Server.ClearError (), вы также очищаете текущую ошибку запроса, поэтому она не обрабатывается обработчиком раздела customErrors

  • Почему выбрасывание HttpException (404) отображает (пустую) страницу со статусом успеха (200)?

Вы не должны бросать никаких исключений в методе Application_Error. Исключение означает, что ваша обработка ошибок не удалась.

...