HTTP-ошибки в контроллерах
199ASP.NET --- ASP.NET MVC 5 --- HTTP-ошибки в контроллерах
Последний из встроенных классов 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);
}
// ...