J'ai une page d'erreur personnalisée configurée pour mon application:
<customErrors mode="On" defaultRedirect="~/errors/GeneralError.aspx"
/>
Dans Global.asax, Application_Error (), le code suivant fonctionne pour obtenir les détails de l'exception:
Exception ex = Server.GetLastError();
if (ex != null)
{
if (ex.GetBaseException() != null)
ex = ex.GetBaseException();
}
Au moment où j'arrive à ma page d'erreur (~ / errors / GeneralError.aspx.cs), Server.GetLastError () est nul
Existe-t-il un moyen d'obtenir les détails de l'exception sur la page d'erreur, plutôt que dans Global.asax.cs?
ASP.NET 3.5 sur Vista / IIS7
Réponses:
En regardant de plus près ma configuration web.config, l'un des commentaires de cet article est très utile
Nous pouvons donc modifier
customErrors
pour ajouter ce paramètre:le
ResponseRewrite
mode nous permet de charger la «Page d'erreur» sans rediriger le navigateur, donc l'URL reste la même, et surtout pour moi, les informations d'exception ne sont pas perdues.la source
UpdatePanel
s; la page d'erreur ne sera plus affichée.OK, j'ai trouvé ce post: http://msdn.microsoft.com/en-us/library/aa479319.aspx
avec ce schéma très illustratif:
(source: microsoft.com )
en substance, pour obtenir ces détails d'exception, je dois les stocker moi-même dans Global.asax, pour une récupération ultérieure sur ma page d'erreur personnalisée.
il semble que le meilleur moyen soit de faire l'essentiel du travail dans Global.asax, les pages d'erreur personnalisées gérant le contenu utile plutôt que la logique.
la source
Une combinaison de ce que NailItDown et Victor ont dit. La méthode préférée / la plus simple consiste à utiliser votre Global.Asax pour stocker l'erreur, puis à la rediriger vers votre page d'erreur personnalisée.
Global.asax :
De plus, vous devez configurer votre web.config :
Et enfin, faites tout ce dont vous avez besoin à l'exception que vous avez stocké dans votre page d'erreur :
la source
Application[]
c'est un objet global. Théoriquement, vous pourriez avoir une condition de concurrence où une deuxième page écrase l'erreur. Cependant, commeSession[]
n'est pas toujours disponible dans des conditions d'erreur, je pense que c'est le meilleur choix.Essayez d'utiliser quelque chose comme
Server.Transfer("~/ErrorPage.aspx");
dans laApplication_Error()
méthode de global.asax.csEnsuite, depuis
Page_Load()
ErrorPage.aspx.cs, vous devriez pouvoir faire quelque chose comme:Exception exception = Server.GetLastError().GetBaseException();
Server.Transfer()
semble garder l'exception en suspens.la source
Server.Transfer
une page est à moitié rendue, le code HTML de la page vers laquelle vous transférez est simplement concaténé à ce qui a déjà été rendu. Vous pouvez donc vous retrouver avec une demi-page cassée suivie de la page d'erreur en dessous.Bien qu'il y ait plusieurs bonnes réponses ici, je dois souligner que ce n'est pas une bonne pratique d'afficher les messages d'exception système sur les pages d'erreur (ce que je suppose que vous voulez faire). Vous pouvez par inadvertance révéler des choses que vous ne souhaitez pas faire à des utilisateurs malveillants. Par exemple, les messages d'exception de Sql Server sont très détaillés et peuvent donner le nom d'utilisateur, le mot de passe et les informations de schéma de la base de données lorsqu'une erreur se produit. Ces informations ne doivent pas être présentées à un utilisateur final.
la source
Voici ma solution ..
Dans Global.aspx:
Dans Oops.aspx:
la source
Une considération importante que je pense que tout le monde manque ici est un scénario d'équilibrage de charge (ferme Web). Étant donné que le serveur qui exécute global.asax peut être différent du serveur qui exécute la page d'erreur personnalisée, le stockage de l'objet d'exception dans Application n'est pas fiable.
Je suis toujours à la recherche d'une solution fiable à ce problème dans une configuration de batterie de serveurs Web, et / ou une bonne explication de MS expliquant pourquoi vous ne pouvez tout simplement pas récupérer l'exception avec Server.GetLastError sur la page d'erreur personnalisée comme vous pouvez dans global.asax Application_Error.
PS Il n'est pas sûr de stocker des données dans la collection Application sans d'abord la verrouiller puis la déverrouiller.
la source
Ceci lié à ces 2 sujets ci-dessous, je veux obtenir à la fois GetHtmlErrorMessage et Session sur la page d'erreur.
La session est nulle après ResponseRewrite
Pourquoi HttpContext.Session est-il nul lorsque redirectMode = ResponseRewrite
J'ai essayé et voir une solution qui n'a pas besoin
Server.Transfer() or Response.Redirect()
Premièrement: supprimez ResponseRewrite dans web.config
Web.config
Puis Global.asax
Puis errorHandler.aspx.cs
Pour les références
http://www.developer.com/net/asp/article.php/3299641/ServerTransfer-Vs-ResponseRedirect.htm
la source
Cela a fonctionné pour moi. dans MVC 5
dans
~\Global.asax
dans
~\Controllers
CréerErrorController.cs
dans
~\Models
CréerFunctionTools.cs
dans
~\Views
Créer un dossierError
et dans~\Views\Error
CréerError.cshtml
Si vous entrez cette adresse
localhost/Error
Et si une erreur survient
Comme cela peut être au lieu d'afficher les erreurs, la variable 'log' à stocker dans la base de données
la source
Je pense que vous avez quelques options ici.
vous pouvez stocker la dernière exception dans la session et la récupérer à partir de votre page d'erreur personnalisée; ou vous pouvez simplement rediriger vers votre page d'erreur personnalisée dans l'événement Application_error. Si vous choisissez ce dernier, vous voulez vous assurer que vous utilisez la méthode Server.Transfer.
la source