Обработка ошибок MVC3 - Настаивает на использовании View под названием «Ошибка» - PullRequest
1 голос
/ 19 декабря 2011

У меня есть определенная обработка ошибок, определенная для моего приложения, и все это прекрасно работает - когда ресурс не может быть найден, отображается правильное представление NotFound.Когда возникает неостановленное исключение, отображается представление «ServerError».

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

"Представление« Ошибка »или его мастер не найден, или никакой движок представления не поддерживает найденные местоположения. Были найдены следующие местоположения:... "

У меня есть обработчик событий Application_Error, который регистрирует все необработанные исключения:

protected void Application_Error(Object sender, EventArgs e)
{
    Exception lastEx = Server.GetLastError();

    // Attempt to Log the error
    try
    {
        Utils.Logger.Error(lastEx);
    }
    catch (Exception loggingEx)
    {
        // Try and write the original ex to the Trace
        Utils.TryTrace(lastEx.Message);

        // Try and write the logging exception to the Trace
        Utils.TryTrace(loggingEx.Message);
    }
}

У меня customErrors включен 'On' в моем web.config:

<customErrors mode="On" defaultRedirect="blah">
    <error statusCode="404" redirect="dee"/>
    <error statusCode="500" redirect="blah"/>
</customErrors>

И у меня есть маршруты, определенные в моем методе Global.asax.cs RegisterRoutes, которые соответствуют перенаправлению, определенному в web.config выше:

routes.MapRoute(
    "Error - 404",
    "dee",
    new { controller = "Error", action = "NotFound" }
    );

routes.MapRoute(
    "ServerError", // When this route is matched we want minimal error info displayed
    "blah",
    new { controller = "Error", action = "ServerError" }
    );

У меня есть BaseController, который содержит подпрограмму OnActionExecuted:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    Logger.Info(String.Format(Constants.LOG_ACTION_EXECUTED, filterContext.Controller.ToString(), filterContext.ActionDescriptor.ActionName));
    // Log any exceptions
    if (filterContext.Exception != null)
    {
        Stack<string> messages = new Stack<string>();
        Exception current = filterContext.Exception;
        messages.Push(current.Message);
        while (current.InnerException != null)
        {
            messages.Push(current.InnerException.Message);                    
            current = current.InnerException;
        }
        StringBuilder result = new StringBuilder();
        while (messages.Count != 0)
        {
            result.Append(messages.Pop());
            string nextline = messages.Count > 0 ? "OUTER EXCEPTION " + messages.Count + ": " : "";
            result.Append(Environment.NewLine);
        }
        Logger.Error(result.ToString());
    }
    base.OnActionExecuted(filterContext);
}

Есть ли где-то еще, что Framework определяет, какое представление следует визуализировать в случае необработанного исключения?

В моей пользовательской подпрограмме обработки ошибок отсутствует последний шаг, который бы гарантировал, что Framework больше не ожидает найти представление «Ошибка» ???

Ответы [ 2 ]

3 голосов
/ 19 декабря 2011

Вам необходимо удалить обработчик HandleErrorAttribute в файле Global.asax.cs. Этот атрибут устанавливает вид как Error. Тогда среда выполнения MVC не будет обрабатывать исключение, а исключение будет распространяться на среду выполнения Asp.Net, где для отображения страницы будет использоваться раздел customErrors.

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute()); // remove this line
    }
0 голосов
/ 22 декабря 2011

Я уже удалил строку, которая автоматически добавляла фильтр ко всем контроллерам ... как предложено Eranga - так что это не то, что заставляло Framework искать представление "Ошибка".

Проблема, с которой я столкнулся, была вызвана некоторыми оставшимися тегами атрибута [HandleError], расположенными поверх одного из моих контроллеров.

Так что интересно отметить, что: несмотря на то, что у моего контроллера был [HandleError], украшенный в верхней части определения класса, моя пользовательская процедура обработки ошибок, определенная в web.config, все еще вызывается и корректно отображает требуемые представления ...

Обработка ошибок в рамках платформы(как определено в HandleErrorAttribute) произойдет сбой, мой Application_Error будет перехватывать исключение и автоматически записывать его в базу данных через мой экземпляр 'Logger' ... тогда моя пользовательская процедура обработки ошибок будет успешно завершена.

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