ASP.Net MVC HandleError выбрасывает 500 Внутренняя ошибка сервера

У меня есть следующий фильтр HandleError на моем контроллере:

[HandleError (ExceptionType = typeof (ArgumentException), View = "DestinationError")]

Я настроил Web.Config так, чтобы были включены customErrors. У меня проблема в том, что фильтр HandleError работает нормально, когда я запускаю приложение локально из Visual Studio, но при развертывании его на сервере все, что я получаю, это 500 Internal Server Error, указывающее, что представление Error не может быть найденный.

Кто-нибудь сталкивался с этим раньше, я подозреваю, что причиной проблемы может быть маршрутизация (хохо). Сайт развертывается в каталоге в корневом веб-каталоге, а не в самом wwwroot, поэтому, возможно, IIS не сможет найти файл ошибок.

4 ответа

Чтобы ответить на мой собственный вопрос, магия заключается в отключении ошибок HTTP в IIS. Я не рад этому обходному пути, поэтому, если у кого-то есть идеи получше, я бы хотел их услышать.

В противном случае вы можете использовать конфигурацию Web.Config и установить для нее ожидаемые действия контроллера. Как это:

    <customErrors mode="On" defaultRedirect="/Error">
        <error statusCode="404" redirect="/Error/NotFound"/>
    </customErrors>

Затем представьте, что у вас есть контроллер ошибок (/Error), который указывает на действие индекса

public class ErrorController : Controller
{
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Index()
    {
        Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        return View("Index");
    }

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult NotFound()
    {
        Response.StatusCode = (int)HttpStatusCode.NotFound;
        return View("NotFound");
    }
}

Что делать, если вы попробуете следующее?

Response.TrySkipIisCustomErrors = true;

У меня была такая же проблема после перехода на MVC 3 RC. Удалось обойти это, добавив макет / мастер-страницу.

@inherits System.Web.Mvc.WebViewPage<System.Web.Mvc.HandleErrorInfo>

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

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

Другие вопросы по тегам