У меня есть код в событии global.asax
файла, Application_Error
который выполняется при возникновении ошибки и отправляет мне подробную информацию об ошибке по электронной почте.
void Application_Error(object sender, EventArgs e)
{
var error = Server.GetLastError();
if (error.Message != "Not Found")
{
// Send email here...
}
}
Это отлично работает, когда я запускаю его в Visual Studio, однако, когда я публикую на нашем живом сервере, Application_Error
событие не запускается .
После некоторого тестирования я могу получить Application_Error
срабатывание, когда я установил customErrors="Off"
, однако установка его обратно customErrors="On"
останавливает повторное срабатывание события.
Может ли кто-нибудь подсказать, почему Application_Error
бы не стрелять, когда customErrors
они включены в web.config
?
Application_Error()
метод не вызывается. Я также объяснил свое окончательное решение.Ответы:
ОБНОВЛЕНИЕ
Поскольку этот ответ предоставляет решение, я не буду его редактировать, но я нашел более чистый способ решения этой проблемы. Подробнее см. Мой другой ответ ...
Исходный ответ:
я понял, почему
Application_Error()
метод не вызывается ...Global.asax.cs
По умолчанию (при создании нового проекта) приложение MVC имеет некоторую логику в
Global.asax.cs
файле. Эта логика используется для отображения маршрутов и регистрации фильтров. По умолчанию он регистрирует только один фильтр:HandleErrorAttribute
фильтр. Когда customErrors включен (или через удаленные запросы, если для него установлено значение RemoteOnly), HandleErrorAttribute сообщает MVC искать представление Error и никогда не вызываетApplication_Error()
метод. Мне не удалось найти документацию по этому поводу, но это объясняется в этом ответе на programmers.stackexchange.com .Чтобы вызвать метод ApplicationError () для каждого необработанного исключения, просто удалите строку, которая регистрирует фильтр HandleErrorAttribute.
Теперь проблема: как настроить customErrors, чтобы получить то, что вы хотите ...
В разделе customErrors по умолчанию используется
redirectMode="ResponseRedirect"
. Вы также можете указать атрибут defaultRedirect как маршрут MVC. Я создал ErrorController, который был очень простым, и изменил свой web.config, чтобы он выглядел так ...web.config
Проблема с этим решением заключается в том, что оно выполняет перенаправление 302 на URL-адреса ваших ошибок, а затем эти страницы отвечают кодом состояния 200. Это приводит к тому, что Google индексирует страницы с ошибками, что плохо. Он также не очень соответствует спецификации HTTP. Я хотел не перенаправлять, а перезаписывать исходный ответ своими пользовательскими представлениями об ошибках.
Я пытался изменить
redirectMode="ResponseRewrite"
. К сожалению, этот параметр не поддерживает маршруты MVC , только статические HTML-страницы или ASPX. Сначала я попытался использовать статическую HTML-страницу, но код ответа все еще был 200, но, по крайней мере, он не перенаправлялся. Затем я получил идею из этого ответа ...Я решил отказаться от MVC для обработки ошибок. Я создал
Error.aspx
иPageNotFound.aspx
. Эти страницы были очень простыми, но в них было одно волшебство ...Этот блок сообщает странице, что будет отображаться правильный код состояния. Грубо говоря, на странице PageNotFound.aspx я
HttpStatusCode.NotFound
вместо этого использовал . Я изменил свой web.config, чтобы он выглядел так ...Все работало отлично!
Резюме:
filters.Add(new HandleErrorAttribute());
Application_Error()
метод для регистрации исключенийЯ заметил несколько недостатков этого решения.
Для этих проблем есть обходные пути, но они меня не слишком беспокоили, чтобы делать дополнительную работу.
Надеюсь, это поможет всем!
источник
<customErrors mode="Off" />
. Удалениеfilters.Add(new HandleErrorAttribute());
или нет не имеет никакого эффекта.Я решил это, создав ExceptionFilter и зарегистрировав там ошибку вместо Application_Error. Все, что вам нужно сделать, это добавить вызов в RegisterGlobalFilters
log4netExceptionFilter.cs
Global.asax.cs
источник
Я нашел статью, в которой описывается гораздо более чистый способ создания пользовательских страниц ошибок в веб-приложении MVC3, который не препятствует возможности регистрировать исключения.
Решение - использовать
<httpErrors>
элемент<system.webServer>
раздела.Я настроил свой Web.config так ...
Я также настроил,
customErrors
чтобы иметьmode="Off"
(как было предложено в статье).Это приводит к тому, что ответы перекрываются действиями ErrorController. Вот этот контроллер:
Представления очень просты, я просто использовал стандартный синтаксис Razor для создания страниц.
Одного этого должно быть достаточно, чтобы вы могли использовать настраиваемые страницы ошибок с MVC.
Мне также потребовалось ведение журнала исключений, поэтому я украл решение Марка об использовании настраиваемого ExceptionFilter ...
Последнее, что вам нужно, это зарегистрировать фильтр исключений в файле Global.asax.cs :
Это кажется гораздо более чистым решением, чем мой предыдущий ответ, и работает так же хорошо, насколько я могу судить. Мне это особенно нравится, потому что не было ощущения, что я борюсь с фреймворком MVC; это решение фактически использует его!
источник
HTTP Error 500.0 - Internal Server Error The page cannot be displayed because an internal server error has occurred.
экран ошибки, а не моя запрошенная/Error/Index
страницаTo able to overwrite global settings in global IIS settings (file: C:\Windows\System32\inetsrv\config \applicationHost.config) should be: <section name="httpErrors" overrideModeDefault="Allow" />
В случае ASP.NET MVC5 использования
Вы можете найти его в
FilterConfig.cs
изApp_Start
папки.источник
Мне нравится ответ Марка с ExceptionFilter, но другой вариант, если все ваши контроллеры происходят от одного и того же базового контроллера, - просто переопределить OnException в вашем базовом контроллере. Здесь вы можете вести журнал и отправлять электронную почту. Это имеет то преимущество, что вы можете использовать любые зависимости, которые вы уже внедрили в свой базовый контроллер с вашим контейнером IoC.
Вы все равно можете использовать свой IoC с IExceptionFilter, но настроить привязки немного сложнее.
источник
Насколько я знаю, вы передаете управление странице, указанной в параметре url, и ваше уведомление о событии будет размещаться здесь, а не Application_Error
Здесь можно найти много информации: http://support.microsoft.com/kb/306355
источник
Чтобы обойти это, я оставил клиентские ошибки отключенными и обработал все ошибки из события Application_Error в global.asax. С MVC это немного сложно, так как я не хотел возвращать перенаправление 301, я хотел вернуть подходящие коды ошибок. Более подробную информацию можно посмотреть в моем блоге по адресу http://www.wduffy.co.uk/blog/using-application_error-in-asp-net-mvcs-global-asax-to-handle-errors/, но окончательный код перечислено ниже...
А вот и контроллер
источник
Response.StatusCode = ###;
он показывал встроенные страницы ошибок MVC вC:\inetpub\custerr\en-US
. Мне также не понравилась идея вручную вызывать HttpHandlers или контроллеры из моего метода Application_Error (). Я рад, что вы нашли решение своей проблемы, я знаю, какие головные боли это доставило мне.Эта запись в блоге помогла мне:
http://asp-net.vexedlogic.com/2011/04/23/asp-net-maximum-request-length-exceeded/
Если вы используете IIS 7.0 или выше, вы можете изменить файл Web.config для обработки слишком больших запросов. Есть некоторые предостережения, но вот пример:
Дополнительные сведения об этих элементах файла конфигурации приведены здесь:
http://www.iis.net/ConfigReference/system.webServer/security/requestFiltering/requestLimits
Код состояния 404.13 определяется как «Слишком большая длина содержимого». Важно отметить, что
maxAllowedContentLength
указывается в байтах. Это отличается отmaxRequestLength
настройки<system.web>
, указанной в разделе, которая указывается в килобайтах.Также обратите внимание, что
path
атрибут должен быть абсолютным путем, когдаresponseMode
естьRedirect
, поэтому добавьте имя виртуального каталога, если это необходимо. Информативные ответы Джесси Уэбба показывают, как это сделатьresponseMode="ExecuteURL"
, и я думаю, что этот подход тоже подойдет.Этот подход не работает, если вы разрабатываете с использованием Visual Studio Development Server (Cassini, веб-сервер, интегрированный в Visual Studio). Я предполагаю, что это будет работать в IIS Express, но я этого не тестировал.
источник
У меня была такая же проблема, когда меня
Application_Error()
не били. Я пробовал все, пока, наконец, не перешагнул через то, что происходило. У меня был специальный код в событии ELMAH, который добавлял JSON в отправляемое им электронное письмо, и там была нулевая ошибка!Исправление внутренней ошибки позволило коду продолжить работу с
Application_Error()
событием, как ожидалось.источник