Как перехватить код состояния http ошибок сервера в общем настраиваемом представлении ошибок в ASP.NET MVC

Я пытаюсь реализовать общую настраиваемую страницу ошибок в ASP.NET MVC 4. Я в основном настраиваю схему ошибок, которая определяет раздел для вывода кода состояния http ответа.

Представление, что я хочу, чтобы мои ошибки заканчивались на этом, наследует такое расположение и просто добавляет сообщение, которое приходит из его модели, которое было создано и передано в вызове View () в Controller (названном «Error»), который я настроил для обработки пользовательских ошибок, в web.config.

<customErrors defaultRedirect="/Error" mode="On"> 
</customErrors>

Пользовательский контроллер ошибок:

public class ErrorController : Controller
{
    public ActionResult Index()
    {
        return View(new CustomErrorViewModel(Response.Status));
    }
}

Пользовательский вид ошибок:

@{
    Layout = "~/Views/Shared/_CustomErrorLayout.cshtml";
}

@using System.Web.Configuration;
@using System.Configuration;
@using MVC_Tests.Models;
@model CustomErrorViewModel

@section HttpCode { @Response.StatusCode }

@Model.Status

Макет:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
    <link href="~/Content/CustomError.css" rel="stylesheet" />
</head>
<body>
    <div id="divError">
        <h1>
            <span>Error &nbsp;</span>
            @RenderSection("HttpCode")
        </h1>
        <div id="divErrorMessage">
            <p>@RenderBody()</p>
        </div>
    </div>
</body>
</html>

Ошибка, которую я пытаюсь устранить, - это простое деление на ноль, которое я добавил к действию Home Index. Обратите внимание, что я хочуодин вид для обработки различных кодов ошибок состояния http сервера (семейство 500).Я знаю, что для каждого отдельного кода статуса http работает отдельное представление, мне нужно одно представление для обработки нескольких кодов.

Пользовательская обработка ошибок работает, я заканчиваю в нужном представлении - но - как отмечалось выше, я ожидал вывести http-код состояния ошибки. Вместо этого я всегда показываю 200 (ОК), что, согласно моему пониманию и отладке, происходит потому, что:

1. Во-первых, когда мы сталкиваемся с делением на ноль, возникает исключение.

2. Теперь происходит перенаправление, потому что мои инструкции web.config обрабатывают ошибки настраиваемым образом (поскольку в файле web.config не указан конкретный код состояния http, я обрабатываю каждый код ошибки состояния http в том же контроллере / представлении ("/ Ошибка "). Здесь важно, чтобы редирект былновый запрос.

3. Перенаправление с шага 2 отправляет меня в контроллер ошибок, а затем отправляет мне его представление, которое отображается.

4. При рендеринге представления код состояния http, вставленный в определенный раздел макета, добавляется мое пользовательское сообщение и вывод части кода состояния http, как я уже сказал: 200 (ОК). Почему, если ошибка 500 на стороне сервера была принудительно выдана? Потому что, если я не ошибаюсь, представление отображается в другом канале запроса, перенаправлении, и в перенаправлении - ошибок не возникает - и я получаю 200 (OK) статусный ответ.

Я прошелэтот пост от Dino Esposito об обработке ошибок в asp.net mvc, но я не хочу добавлять фильтры (решения атрибутов OnException и HandleError) ко всем контроллерам приложения (я мог бы создать новый базовый контроллер с таким фильтром и сделать все другие наследуют его, но это также требует изменения всех классов контроллеров). Последний подход, о котором он упоминает (обработка события Application_Error global.asax), я не уверен, что служит этой цели - мне нужно выполнить инструкцию перенаправления «Response.Redirect» в обработчике, которая превосходит гибкость возможности устанавливать пользовательские страницы в web.config (я все еще могу перенаправить на маршрут, определенный в web.config, но мне интересно, не слишком ли это громоздко для чего-то, что выглядит так просто).

Каков наилучший способ зафиксировать код состояния http ответа на любую ошибку сервера в моем настраиваемом представлении ошибок?

Ответы на вопрос(0)

Ваш ответ на вопрос