asp.net глобальный фильтр обработчика ошибок MVC 3 всегда показывает страницу состояния IIS 500 - PullRequest
9 голосов
/ 30 января 2011

Я перепробовал все, даже удаление asp.net mvc3, и не могу заставить работать глобальный фильтр HandleError.

Я установил фильтр HandleError в Global.asax:

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 {
     filters.Add(new HandleErrorAttribute());
 }

Также у меня включены CustomErrors (не имеет значения, если я установил defaultRedirect = "Error" или нет, я думаю, что это в документации, потому что это необходимо для более старых версий mvc):

<customErrors mode="On" />

Попытка перемещаться по странице до тех пор, пока не возникнет ошибка, независимо от того, делаете ли вы это с localhost или используете имя хоста, внутри сервера разработки или IIS 7.5, она всегда перенаправляет на стандартную страницу состояния 500 вместо моего пользовательского Error.cshtml посмотреть, что я создал в Shared. Вот код ошибки:

@model System.Web.Mvc.HandleErrorInfo

@{
    ViewBag.Title = "Oooops";
}

<h2>Ooops Something really bad happened!</h2>

Также я заметил, что если я создаю новый проект ASP.NET MVC3, а затем выбираю шаблон «Интернет-приложение» и просто включаю customErrors в этом проекте, тогда фильтр HandleError начинает работать нормально, но с использованием пустого шаблона MVC3 не.


Я хочу уточнить, что на самом деле я могу видеть, что представление ошибок обрабатывается при отладке, однако в браузере всегда отображается страница Ошибка 500.

Ответы [ 6 ]

18 голосов
/ 28 июня 2011

Чтобы исправить это, все, что вам нужно сделать, это отредактировать страницу Error.cshtml и убедиться, что вы правильно установили свойство Layout. В пустом приложении MVC 3 это значение равно NULL, что вызывает внутреннюю ошибку сервера HTTP 500.

Я исправил эту проблему, просто добавив:

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

8 голосов
/ 01 апреля 2011

Я столкнулся с этой же проблемой. Я нашел этот пост: 500 Внутренняя ошибка сервера в ASP.NET MVC и попытался снять флажок «Friendly Http Errors», и мой атрибут HandleErrors начал работать должным образом в IE 8 с проверенным режимом совместимости IE 7 (и начал работать как это делается в Chrome по умолчанию). Я не думаю, что это правильное решение для развернутого приложения, но, возможно, есть способ расширить атрибут HandleError, чтобы он перенаправлял на контроллер «Ошибка», а не просто по умолчанию представление «Ошибка».

ОБНОВЛЕНИЕ: Этот пост показывает, что при возврате HTTP Status 500 IE обрабатывает его неловко. Чтобы обойти это, нужно установить Status на 200, тогда кажется, что все работает нормально (даже в IE).

public class CustomHandleErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {    
        base.OnException(filterContext);

        //https://stackoverflow.com/questions/5137627/mvc-handleerror-returns-error-500-and-view-error-page
        //https://stackoverflow.com/questions/183316/asp-net-mvc-handleerror
        filterContext.HttpContext.Response.StatusCode = 200;
    }
}
6 голосов
/ 31 января 2011

Что ж, это весело, наконец-то нашел ответ, на этом компьютере установлена ​​бета-версия Internet Explorer 9, и есть разница в поведении при обработке состояния 500, которое устанавливает атрибут HandleError перед отображением представления «Ошибка».

Iпробовал с другими браузерами и работает нормально: Chrome vs IE 9 Beta

Что я не могу отстранить сейчас, так это то, почему шаблон "Internet Appication" работал.

Кто-нибудь знает, где я могу опубликовать ошибку?Это должно пойти в команду asp.net mvc или IE 9?Как мне с ними связаться?

4 голосов
/ 15 июня 2011

Найдена проблема - страница с ошибкой - убедитесь, что вы добавили фиктивный контент - чтобы размер контента был не менее 1 КБ.

Вот содержимое Error.cshtml

<!DOCTYPE html>
<html>
<head>
    <title>Error</title>
</head>
<body>
    <h2>
        Sorry, an error occurred while processing your request. @DateTime.Now
    </h2>
    <div>
    ..........................................................................
    ..........................................................................
    ..........................................................................
    ..........................................................................
    ..........................................................................
    ..........................................................................
    ..........................................................................
    ..........................................................................
    ..........................................................................
    ..........................................................................
    ..........................................................................
    </div>
</body>
</html>
1 голос
/ 30 января 2011

Вот шаги, которые я использовал и которые работали для меня:

  1. Создание нового проекта ASP.NET MVC 3 с использованием пустого шаблона
  2. Добавьте новый контроллер с именем HomeController со следующим содержимым (вам не нужно никакого представления => мы все равно выкидываем исключение):

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            throw new Exception("error");
        }
    }
    
  3. Включите пользовательские ошибки в web.config, добавив следующий раздел:

    <customErrors mode="On">
    </customErrors>
    
  4. Запустите сайт, и будет отображено представление ~/Views/Shared/Error.cshtml, созданное шаблоном.

0 голосов
/ 10 мая 2011

Я думаю, что нашел способ обойти это.Замените ваши Error.cshtml и _Layout.cshtml теми, которые были сгенерированы из шаблонов Интернета или Интранета.

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