Исключения в ASP.NET MVC неправильно перенаправляются на маршрут по умолчанию для ошибок клиентов - PullRequest
0 голосов
/ 01 июля 2010

У меня проблема с исключениями, показывающими приложение в виде трассировки стека на странице.

Я думал, что смягчил это, добавив это к web.config:

<customErrors mode="On" defaultRedirect="~/error/GenericError">
    <error statusCode="403" redirect="~/error/NoAccess" />
    <error statusCode="404" redirect="~/error/NotFound" />
</customErrors>

Работает для несуществующих маршрутов, но не когда контроллер выдает исключение. Вот логика контроллера:

[HandleError]
public class DebugController : Controller
{      
    public ActionResult Index()
    {
        throw new Exception("** Testing custom error Handling **");
        return View();
    }
}



public class ErrorController : Controller
{
    //
    // GET: /Error/

    public ActionResult NotFound()
    {
        ViewData["error"] = "That page does not exist.";
        return View();
    }

    public ActionResult GenericError()
    {
        if (null == TempData["error"]))
        {
            ViewData["error"] = "We're sorry, but an error has occurred.";
        }
        else
        {
            ViewData["error"] = TempData["error"];
        }

        return View();
    }

    public ActionResult NoAccess()
    {
        ViewData["error"] = "You are not authorized to access application";
        return View();
    }

}

А вот и вид:

<%@ Page Title="" Language="C#"
    MasterPageFile="~/Views/Shared/CenterContentNoSidebar.Master"
    Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
GenericError
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>An Error has occurred</h2>
    <br />
    <%= ViewData["error"] %>
</asp:Content>

<asp:Content ID="Content3" ContentPlaceHolderID="NavContent" runat="server">
</asp:Content>

Нужно ли что-то помещать в Global.asax, чтобы это работало?

Ответы [ 2 ]

2 голосов
/ 01 июля 2010

Итак, атрибут HandleError фактически обрабатывает ошибку и пытается вернуть представление Error.aspx из папки представления контроллеров или общего расположения. Раздел customErrors web.config никогда не используется, и поскольку страница может не существовать, желтый экран смерти отображается в любом случае. Несуществующие маршруты работают, потому что IIS выдает ошибку 404 и не имеет контекста контроллера или атрибута HandleError. Если вы хотите обрабатывать ошибки самостоятельно, я бы предложил удалить атрибуты HandleError и позволить customErrors некоторые из них пройти. Хотя из вашего контроллера ошибок вы должны были бы взять последнее исключение и что-то с ним сделать. Вот хорошая ссылка на то, о чем я говорю немного.

http://blog.dantup.com/2009/04/aspnet-mvc-handleerror-attribute-custom.html

Это тот или иной тип вещи, атрибут HandleError или раздел customErrors web.config.

1 голос
/ 01 июля 2010

Вы видите это поведение из-за [HandleError], который вы поместили в верхнюю строку. См. Этот вопрос / ответ в стеке для получения дополнительной информации об атрибуте [HandleError].

Ошибка ручки StackOverflow Q & A

...