HTTP-ошибки в контроллерах

199

Последний из встроенных классов ActionResult, который мы рассмотрим, предназначен для отправки клиенту специфичных сообщений об ошибках и результирующих кодов HTTP. В большинстве приложений эти средства не требуются, поскольку MVC Framework генерирует такие разновидности результатов автоматически. Однако они могут быть полезны в ситуациях, когда необходим более прямой контроль над тем, какие ответы отправляются клиенту.

Отправка специфичного результирующего кода HTTP

Отправить браузеру специфичный код состояния HTTP можно с помощью класса HttpStatusCodeResult. Поскольку для этого никаких вспомогательных методов в контроллере не предусмотрено, придется создавать экземпляр HttpStatusCodeResult непосредственно, как показано в примере ниже:

using System;
using System.Web.Mvc;

namespace ControllersAndActions.Controllers
{
    public class ExampleController : Controller
    {
        // ...

        public HttpStatusCodeResult StatusCode()
        {
            // Ошибка 404 - URL не может быть обслужен
            return new HttpStatusCodeResult(404, "Страница не найдена");
        }
    }
}

Параметрами конструктора для класса HttpStatusCodeResult являются числовой код состояния и необязательное описательное сообщение. В этом примере был возвращен код 404, который означает, что запрошенный ресурс не существует.

Отправка результата с кодом 404

Того же самого эффекта, что и в примере выше, можно достичь с использованием более удобного класса HttpNotFoundResult, который является производным от HttpStatusCodeResult и может быть создан с помощью удобного метода HttpNotFound() контроллера, как показано в примере ниже:

// ...
public HttpStatusCodeResult StatusCode()
{
    // Ошибка 404 - URL не может быть обслужен
    return HttpNotFound();
}
// ...

Отправка результата с кодом 401

Еще одним классом-оболочкой для специфичного кода состояния HTTP является HttpUnauthorizedResult, который возвращает код 401, используемый для обозначения авторизованного запроса. Демонстрация его применения приведена ниже:

// ...
public HttpStatusCodeResult StatusCode()
{
    return new HttpUnauthorizedResult();
}
// ...

Для создания экземпляров HttpUnauthorizedResult в классе Controller вспомогательных методов не предусмотрено, так что придется делать это напрямую. Результат возвращения экземпляра этого класса обычно состоит в перенаправлении пользователя на страницу аутентификации.

Модульное тестирование: коды состояния HTTP

Класс HttpStatusCodeResult следует шаблону проектирования, применение которого вы уже видели для других типов результатов, и делает свое состояние доступным через набор свойств. В данном случае свойство StatusCode возвращает числовой код состояния HTTP, а свойство StatusDescription - ассоциированную с кодом строку описания.

Следующий тестовый метод предназначен для проверки метода действия из последней версии метода StatusCode():

// ...
[TestMethod]
public void ControllerTest()
{
    // Организация - создание контроллера
    ExampleController controller = new ExampleController();

    // Действие - вызов метода действия
    HttpStatusCodeResult result = controller.StatusCode();

    // Утверждение - проверка результата
    Assert.AreEqual(401, result.StatusCode);
}
// ...
Пройди тесты
Лучший чат для C# программистов