J'ai du code dans le global.asax
Application_Error
événement du fichier qui s'exécute lorsqu'une erreur se produit et m'envoie les détails de l'erreur par e-mail.
void Application_Error(object sender, EventArgs e)
{
var error = Server.GetLastError();
if (error.Message != "Not Found")
{
// Send email here...
}
}
Cela fonctionne bien lorsque je l'exécute dans Visual Studio, mais lorsque je publie sur notre serveur en direct, l' Application_Error
événement ne se déclenche pas.
Après quelques tests, je peux obtenir le Application_Error
tir quand je suis réglécustomErrors="Off"
, mais le remettre à l' customErrors="On"
arrêt empêche l'événement de se déclencher à nouveau.
Quelqu'un peut-il suggérer pourquoi Application_Error
ne serait pas déclenché lorsque customErrors
sont activés dans le web.config
?
Application_Error()
méthode n'a pas été invoquée. J'ai également expliqué ma solution finale.Réponses:
MISE À JOUR
Puisque cette réponse fournit une solution, je ne la modifierai pas, mais j'ai trouvé un moyen beaucoup plus propre de résoudre ce problème. Voir mon autre réponse pour plus de détails ...
Réponse originale:
J'ai compris pourquoi la
Application_Error()
méthode n'est pas invoquée ...Global.asax.cs
Par défaut (lorsqu'un nouveau projet est généré), une application MVC a une certaine logique dans le
Global.asax.cs
fichier. Cette logique est utilisée pour mapper les routes et enregistrer les filtres. Par défaut, il n'enregistre qu'un seul filtre: unHandleErrorAttribute
filtre. Lorsque customErrors est activé (ou via des requêtes distantes lorsqu'il est défini sur RemoteOnly), HandleErrorAttribute indique à MVC de rechercher une vue d'erreur et n'appelle jamais laApplication_Error()
méthode. Je n'ai pas pu trouver de documentation à ce sujet, mais elle est expliquée dans cette réponse sur programmers.stackexchange.com .Pour obtenir la méthode ApplicationError () appelée pour chaque exception non gérée, supprimez simplement la ligne qui enregistre le filtre HandleErrorAttribute.
Maintenant, le problème est: Comment configurer les customErrors pour obtenir ce que vous voulez ...
La section customErrors est définie par défaut sur
redirectMode="ResponseRedirect"
. Vous pouvez également spécifier l'attribut defaultRedirect comme une route MVC. J'ai créé un ErrorController qui était très simple et j'ai changé mon web.config pour qu'il ressemble à ceci ...web.config
Le problème avec cette solution est qu'elle effectue une redirection 302 vers vos URL d'erreur, puis ces pages répondent avec un code d'état 200. Cela conduit Google à indexer les pages d'erreur, ce qui est mauvais. Il n'est pas non plus très conforme à la spécification HTTP. Ce que je voulais faire, ce n'était pas de rediriger et de remplacer la réponse d'origine par mes vues d'erreur personnalisées.
J'ai essayé de changer
redirectMode="ResponseRewrite"
. Malheureusement, cette option ne prend pas en charge les routes MVC , uniquement les pages HTML statiques ou ASPX. J'ai essayé d'utiliser une page HTML statique au début, mais le code de réponse était toujours de 200, mais au moins il n'a pas redirigé. J'ai alors eu une idée de cette réponse ...J'ai décidé d'abandonner MVC pour la gestion des erreurs. J'ai créé un
Error.aspx
et unPageNotFound.aspx
. Ces pages étaient très simples mais elles avaient un morceau de magie ...Ce bloc indique à la page à être servie avec le code d'état correct. De grossier, sur la page PageNotFound.aspx, j'ai utilisé à la
HttpStatusCode.NotFound
place. J'ai changé mon web.config pour qu'il ressemble à ceci ...Tout a parfaitement fonctionné!
Résumé:
filters.Add(new HandleErrorAttribute());
Application_Error()
méthode pour consigner les exceptionsIl y a quelques inconvénients que j'ai remarqués avec cette solution.
Il existe des solutions de contournement pour ces problèmes, mais je n'étais pas suffisamment préoccupé par eux pour faire un travail supplémentaire.
J'espère que cela aide tout le monde!
la source
<customErrors mode="Off" />
. Avoirfilters.Add(new HandleErrorAttribute());
supprimé ou non n'a aucun effet.J'ai résolu cela en créant un ExceptionFilter et en y enregistrant l'erreur au lieu de Application_Error. Tout ce que vous avez à faire est d'ajouter un appel à dans RegisterGlobalFilters
log4netExceptionFilter.cs
Global.asax.cs
la source
J'ai trouvé un article qui décrit une manière beaucoup plus propre de créer des pages d'erreur personnalisées dans une application Web MVC3, ce qui n'empêche pas la possibilité de consigner les exceptions.
La solution est d'utiliser l'
<httpErrors>
élément de la<system.webServer>
section.J'ai configuré mon Web.config comme ça ...
J'ai également configuré
customErrors
pour avoirmode="Off"
(comme suggéré par l'article).Cela rend les réponses remplacées par les actions d'un ErrorController. Voici ce contrôleur:
Les vues sont très simples, je viens d'utiliser la syntaxe standard de Razor pour créer les pages.
Cela seul devrait vous suffire pour utiliser des pages d'erreur personnalisées avec MVC.
J'avais également besoin de journalisation des exceptions, alors j'ai volé la solution de Mark d'utiliser un ExceptionFilter personnalisé ...
La dernière chose dont vous avez besoin est d'enregistrer le filtre d'exception dans votre fichier Global.asax.cs :
Cela semble être une solution beaucoup plus propre que ma réponse précédente et fonctionne aussi bien que je sache. Je l'aime particulièrement parce que je n'avais pas l'impression de me battre contre le framework MVC; cette solution en tire profit!
la source
HTTP Error 500.0 - Internal Server Error The page cannot be displayed because an internal server error has occurred.
écran d'erreur, pas ma/Error/Index
page demandéeTo able to overwrite global settings in global IIS settings (file: C:\Windows\System32\inetsrv\config \applicationHost.config) should be: <section name="httpErrors" overrideModeDefault="Allow" />
En cas d' utilisation d' ASP.NET MVC5
Vous pouvez le trouver dans
FilterConfig.cs
deApp_Start
dossier.la source
J'aime la réponse de Mark avec le ExceptionFilter, mais une autre option, si tous vos contrôleurs dérivent du même contrôleur de base, consiste simplement à remplacer OnException dans votre contrôleur de base. Vous pouvez y faire votre journalisation et vos e-mails. Cela a l'avantage de pouvoir utiliser toutes les dépendances que vous avez déjà injectées dans votre contrôleur de base avec votre conteneur IoC.
Vous pouvez toujours utiliser votre IoC avec un IExceptionFilter, mais c'est un peu plus délicat de configurer vos liaisons.
la source
Pour autant que je sache, vous passez le contrôle sur la page spécifiée dans le paramètre url et votre notification d'événement se trouverait ici, plutôt que Application_Error
Vous trouverez de nombreuses informations ici: http://support.microsoft.com/kb/306355
la source
Pour contourner cela, j'ai fini par laisser customerrors désactivé et gérer toutes les erreurs de l'événement Application_Error dans global.asax. C'est un peu délicat avec MVC car je ne voulais pas renvoyer une redirection 301, je voulais renvoyer des codes d'erreur appropriés. Plus de détails peuvent être consultés sur mon blog à http://www.wduffy.co.uk/blog/using-application_error-in-asp-net-mvcs-global-asax-to-handle-errors/ mais le code final est énumérés ci-dessous...
Et voici le contrôleur
la source
Response.StatusCode = ###;
, il montrait les pages d'erreur MVC intégrées àC:\inetpub\custerr\en-US
. Je n'aimais pas non plus l'idée d'invoquer manuellement HttpHandlers ou Controller à partir de ma méthode Application_Error (). Je suis heureux que vous ayez trouvé une solution à votre problème, je sais quel genre de maux de tête cela m'a causé.Cette entrée de blog m'a aidé:
http://asp-net.vexedlogic.com/2011/04/23/asp-net-maximum-request-length-exceeded/
Si vous utilisez IIS 7.0 ou supérieur, vous pouvez modifier votre fichier Web.config pour gérer les demandes trop volumineuses. Il y a quelques mises en garde, mais voici un exemple:
Il y a des détails supplémentaires sur ces éléments de fichier de configuration ici:
http://www.iis.net/ConfigReference/system.webServer/security/requestFiltering/requestLimits
Le code d'état 404.13 est défini comme "Longueur du contenu trop grande". Une chose importante à noter est que le
maxAllowedContentLength
est spécifié en octets. Ceci est différent dumaxRequestLength
paramètre que vous trouvez dans la<system.web>
section, qui est spécifié en kilo-octets.Notez également que l'
path
attribut doit être un chemin absolu lorsqueresponseMode
estRedirect
, donc ajoutez le nom du répertoire virtuel, le cas échéant. Les réponses informatives de Jesse Webb montrent comment faire celaresponseMode="ExecuteURL"
, et je pense que cette approche fonctionnerait bien aussi.Cette approche ne fonctionne pas si vous développez à l'aide de Visual Studio Development Server (Cassini, le serveur Web intégré à Visual Studio). Je suppose que cela fonctionnerait dans IIS Express, mais je ne l'ai pas testé.
la source
J'avais le même problème là où je n'étais
Application_Error()
pas touché. J'ai tout essayé, jusqu'à ce que finalement je découvre ce qui se passait. J'avais un code personnalisé dans un événement ELMAH qui ajoutait JSON à l'e-mail qu'il envoie, et il y avait une erreur nulle là-dedans!La correction de l'erreur interne a permis au code de continuer sur l'
Application_Error()
événement comme prévu.la source