Пользовательские ошибки работают для HttpCode 403, но не для 500?

Я реализую пользовательские ошибки в своем приложении MVC3, оно включено в web.config:

<customErrors mode="On">
  <error statusCode="403" redirect="/Errors/Http403" />
  <error statusCode="500" redirect="/Errors/Http500" />
</customErrors>

Мой контроллер очень простой, с соответствующими правильно названными представлениями:

public class ErrorsController : Controller
{
    public ActionResult Http403()
    {
        return View("Http403");
    }

    public ActionResult Http500()
    {
        return View("Http500");
    }
}

Для проверки я бросаю исключения в другой контроллер:

public class ThrowingController : Controller
{
    public ActionResult NotAuthorised()
    {
        throw new HttpException(403, "");
    }

    public ActionResult ServerError()
    {
        throw new HttpException(500, "");
    }
}

403 работает - меня перенаправляют на мой пользовательский "/Errors/Http403".

500 не работает - вместо этого меня перенаправляют на страницу ошибки по умолчанию в общей папке.

Любые идеи?


person Nick    schedule 20.04.2012    source источник


Ответы (2)


У меня есть 500 ошибок и работает с использованием httpErrors в дополнение к стандартной конфигурации customErros:

  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="403" subStatusCode="-1" />
      <error statusCode="403" path="/Errors/Http403" responseMode="ExecuteURL" />
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="500" path="/Errors/Http500" responseMode="ExecuteURL" />
    </httpErrors>
  </system.webServer>

И удаление этой строки из global.asax

GlobalFilters.Filters.Add(new HandleErrorAttribute());

Однако это не идеально, поскольку я пытаюсь получить последнюю ошибку, которая всегда равна нулю.

Server.GetLastError()

См. https://stackoverflow.com/a/7499406/1048369 для получения наиболее полного описания пользовательских ошибок в MVC3 нашел, что очень помогло.

person Nick    schedule 22.04.2012
comment
Я хотел бы повторить это: Server.GetLastError кажется неисправимым :( - person Grimace of Despair; 23.12.2012

У меня та же проблема, в этом случае я ловлю исключение непосредственно в Global.asax:

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

            Response.Clear();



            HttpException httpException = exception as HttpException;

            var code = httpException == null ? 500 : httpException.GetHttpCode();

            // Log the exception.
            if (code == 500)
                logError.Error(exception);

            Server.ClearError();

            Context.Items["error"] = code;

            RouteData routeData = new RouteData();
            routeData.Values.Add("controller", "Error");
            routeData.Values.Add("action", "Index");
            routeData.Values.Add("code", code);

            IController errorController = new ErrorController();
            errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));

        }

Это перенаправляет на мою пользовательскую ошибку 500: /Error/Index?code=500

person fmgp    schedule 20.04.2012
comment
Я пока не могу принять это как ответ, так как он работает без использования метода Application_Error и вместо этого использует раздел конфигурации httpErrors. Я бы дал вашему ответу +1, но у меня еще недостаточно представителей! Привет! - person Nick; 20.04.2012
comment
Конечно, нет причин, по которым httpErrors не работает (хорошая настройка), решение, которое я использую, дает мне больше контроля над неперехваченными исключениями. - person fmgp; 20.04.2012
comment
Недопустимая логика утверждать, что если httpException имеет значение null, то следует сделать предположение, что это ошибка 500. Ошибка 500 должна быть подтверждена данными, переданными исключением. - person Chris Halcrow; 05.02.2016