2009-02-08 3 views
10

У меня возникли проблемы с использованием атрибута [HandleError] в моих действиях контроллера - он вообще не работает (т. Е. Не имеет значения, есть ли фильтр или нет) Я получаю те же результаты ...). Когда выбрано исключение, я получаю стандартную красную тональную ошибку сервера на странице «/» Application error вместо моего пользовательского представления.атрибут вообще не работает

Я нашел пару других тем по теме здесь, на SO, и в большинстве случаев кажется, что установка опции customErrors для On в web.config решила проблему. Это не для меня, поэтому мне нужно найти другое решение.

Мои действия контроллера:

[HandleError] 
public ActionResult Index() 
{ 
    throw new Exception("oops..."); 
    return View(); 
} 

В моем файле web.config

<customErrors mode="On"></customErrors> 

Я убедился, что файл Error.aspx находится в общей директории тоже. Что мне не хватает?

Я запускаю ASP.NET MVC RC Refresh.

ответ

11

две полезные вещи, чтобы знать:

По умолчанию HandleError ничего не делает, когда работает под сервером разработки. Намерение состоит в том, чтобы показать разработчикам более полезную информацию:

public virtual void OnException(ExceptionContext filterContext) { 
    if (filterContext == null) { 
     throw new ArgumentNullException("filterContext"); 
    } 

    // If custom errors are disabled, we need to let the normal ASP.NET 
    // exception handler execute so that the user can see useful 
    // debugging information. 
    if (filterContext.ExceptionHandled 
     || ! filterContext.HttpContext.IsCustomErrorEnabled) { 
     return; 
    } 

Обратите внимание, что этот случай является именно то, что customError должен контролировать. Если установка customError="On" не изменяет этот тип поведения:

  1. Проверьте свой синтаксис.
  2. Убедитесь, что вы редактируете Web.config в корне проекта, а не в представлениях.
  3. Убедитесь, что нет кодов HttpContext.IsCustomErrorEnabled.
  4. Если все остальное терпит неудачу, попробуйте включить отладку в Web.config от

Во-вторых, есть определенные типы ошибок, которые HandleError никогда не будет обрабатывать, в частности, ошибки компиляции ASP.NET. Вы не говорите, с какой ошибкой вы сталкиваетесь.

+0

благодарит за ваш ответ! ваше первое замечание действительно объясняет, почему я не вижу эффекта ... есть ли способ проверить локальность ошибок перед загрузкой на сервер? как? мой проект компилируется, но я намеренно бросаю исключения во время выполнения, чтобы проверить обработку ошибок. –

+0

См. Обновленный ответ. –

+0

Привет. Я теперь попробовал customErrors = «Вкл» с и без перенаправления по умолчанию, customErrors = «Отключить», полностью удалив узел и установив debug = «false» - и единственное различие заключается в том, какая информация отображается на красной тонированной ошибке page ... Отладка или использование Cassini вызывает эту проблему? –

3

Необходимо также указать, на какую страницу перенаправить.

<customErrors mode="On" defaultRedirect="Error.aspx" /> 

EDIT: Огорченно/Shared/часть не следует ставить там, но вы должны сказать MVC, какие страницы, чтобы отправить пользователю с Error.aspx. Затем маршрут по умолчанию ищет что-то, называемое Error.aspx в shared.

Было очень поздно! :) Думаю, именно поэтому кто-то дал мне минус за ответ! :) По крайней мере, здесь работает помощник!

+0

Мне очень жаль, но он не работает с Error.aspx либо ... –

+0

Кроме того, оно не должно быть необходимым в соответствии с этой статьей http://weblogs.asp.net/ scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx (который является самым последним, которого я смог найти, хотя это только на PV4 ...) –

+0

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

3

У меня такая же проблема, и мне потребовались два полных дня, чтобы понять это. Оказалось, что я получил ошибку на странице Site.Master, а Error.aspx использовал эту же главную страницу, как и все остальные страницы. Очевидно, что Error.aspx не может справиться с такой ситуацией.

Мое решение состоит в том, чтобы создать определенную страницу Error.master, которая легка и не включает данные модели. Кроме того, я создал статическую ошибку.htm в случае возникновения ошибки из Error.aspx. Настройка Web.config выглядит следующим образом:

<customErrors mode="On"> 
    <error statusCode="500" redirect="Error.htm" /> 
</customErrors> 

Надеюсь, что это поможет.

+0

Моя страница Error.aspx также выбрасывала свое собственное исключение. Это боль отлаживать! –

+0

Error.htm, кажется, возвращает код ответа HTTP-ответа 200, а не 500, как он должен! –

0

Еще одной причиной этой проблемы может быть,

В шаблон MVC Application (генерируется VS2008/VS2008 Express), Error.aspx (генерируемой VS) использует Master Page.

Если Master-страница имеет доступ к любому представлению ViewData, он будет генерировать нулевую ссылку Exception, тогда ошибка.aspx не будет показана.

Используйте этот простой код в качестве Error.aspx, он будет решать эту проблему, (наряду с CustomErrors = On)

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 
<%= Model.Exception.Message %> 
0

Чтобы обойти 404 проблемы, когда Error.aspx должен был быть показан , Я должен был исключить Error.aspx из раздела httpHandler, который запретил доступ к каким-либо представлениям напрямую (вокруг рамки mvc 2). Я сделал это, поставив Error.aspx в подпапку «Ошибка» и положив файл web.config в эту подпапку с <remove path="*" verb="*" /> в разделе httpHandlers. Моя версия этой проблемы (и ее решение) могут быть специфическими для MVC 2.

Не забудьте обновить ссылку defaultRedirect, когда вы перемещаете Error.aspx :)

0

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

Response.StatusCode = (int)HttpStatusCode.NotFound; 

Я вытягивал свои волосы, поскольку сообщения об ошибках IIS продолжали перехватывать мою обработку ошибок. И хотя он не идеален, так как я хочу предоставить этот код статуса в своем ответе, я обнаружил, что его удаление мешало IIS 7+ мешать моей обработке ошибок.

DaTribe

+0

Если вы хотите использовать это, и вы можете, сначала вам нужно установить 'Response.TrySkipIisCustomErrors = true'. – ehdv