Comment créer des pages de rapport d'erreurs personnalisées dans ASP.NET à l'aide de Visual C# .NET

Pour obtenir une version Microsoft Visual Basic .NET de cet article, reportez-vous à la section.
308132 .

Cet article fait référence à l’espace de noms bibliothèque de classes Microsoft.NET Framework suivant :
  • System.Diagnostics

DANS CETTE TÂCHE.

Résumé

Cet article décrit comment utiliser le code Visual C# .NET pour intercepter et répondre aux erreurs lorsqu’elles se produisent dans ASP.NET. ASP.NET a amélioré les options à partir de Microsoft Active Server Pages (ASP) traditionnelles de gestion des erreurs. Dans ASP.NET, vous pouvez gérer des erreurs à différents niveaux dans vos applications.

Retour au début

Nouvelles fonctionnalités dans ASP.NET

ASP.NET offre de nombreux progrès dans la manière dont vous pouvez gérer et répondre aux erreurs. Dans les pages ASP traditionnelles, vous gérez les erreurs avec « On Error Resume Next » (ou les blocs try-catch dans JScript). Alternativement, si vous exécutez Microsoft Internet Information Services (IIS) 5.0, vous devez utiliser l’objet ASPError pour créer une page de rapport d’erreurs personnalisée. Toutefois, ces approches ont leurs limitations.

ASP.NET fournit plusieurs niveaux à partir duquel vous pouvez gérer et répondre aux erreurs qui peuvent se produire lorsque vous exécutez une application ASP.NET. ASP.NET fournit trois principales méthodes qui vous permettent d’intercepter et de répondre aux erreurs quand elles se produisent : Page_Error Application_Erroret le fichier de configuration d’application (Web.config).

Cet article explique comment utiliser ces nouvelles fonctionnalités dans votre application ASP.NET. Bien que cet article décrit comment fournir des pages d’erreurs personnalisées et les rapports d’erreurs généraux comme il est directement lié à ASP.NET, cet article ne décrit pas les autre approches, telles que le bloc try-catch-finally et au système d’exceptions Common Language Runtime (CLR) de gestion d’erreur.

Retour au début

Comment utiliser la méthode Page_Error

Le Gestionnaire d’événements Page_Error permet d’intercepter les erreurs qui se produisent au niveau de la page. Vous pouvez afficher simplement des informations d’erreur (comme l’exemple de code à suivre), ou vous pouvez enregistrer l’événement ou exécuter une autre action.

Remarque Cet exemple affiche des informations d’erreur détaillées dans le navigateur uniquement à des fins de démonstration. Vous devez être prudent lors de l’affichage des informations détaillées à l’utilisateur final de l’application, en particulier lorsque l’application s’exécute sur Internet. Une action plus appropriée serait d’afficher un message à l’utilisateur informant qu’une erreur s’est produite, puis d’enregistrer les détails sur l’erreur dans le journal des événements.

Cet exemple lève une exception nulle, ce qui provoque une erreur dans le Gestionnaire d’événements Page_Load . Suivez ces étapes pour créer la page initiale qui démontrera l’utilisation du Gestionnaire d’événements Page_Error .
  1. Suivez ces étapes pour ajouter un nouveau fichier nommé PageEvent.aspx à votre projet :
    1. Ouvrez Microsoft Visual Studio .NET.
    2. Dans l’Explorateur de solutions, cliquez sur le nœud du projet, pointez sur Ajouter, puis cliquez sur Ajouter un formulaire Web.
    3. Dans la zone de texte nom , tapez PageEvent.aspxet puis cliquez sur Ouvrir.
  2. Ajoutez le code suivant à PageEvent.aspx :
    <script language=C# runat="server">void Page_Load(object sender, System.EventArgs e)
    {
    throw(new ArgumentNullException());
    }

    public void Page_Error(object sender,EventArgs e)
    {
    Exception objErr = Server.GetLastError().GetBaseException();
    string err ="<b>Error Caught in Page_Error event</b><hr><br>" +
    "<br><b>Error in: </b>" + Request.Url.ToString() +
    "<br><b>Error Message: </b>" + objErr.Message.ToString()+
    "<br><b>Stack Trace:</b><br>" +
    objErr.StackTrace.ToString();
    Response.Write(err.ToString());
    Server.ClearError();
    }
    </script>


    Remarque Dans cet exemple, l’attribut AutoEventWireup n’est pas définie explicitement. Si vous n’affectez pas explicitement une valeur à l’attribut AutoEventWireup , la valeur true par défaut valeur est utilisée. Si vous utilisez Visual Studio .NET pour développer vos applications, le code de modèle Web Form définit explicitement la valeur de l’attribut AutoEventWireup à false. Il existe une différence importante entre la valeur par défaut par ASP.NET et la valeur par défaut que le code de modèle de Visual Studio .NET affecte à cet attribut. Si la valeur de l’attribut AutoEventWireup est définie sur false, les gestionnaires d’événements qui sont déclarés dans le. Page ASPX ne se déclenchent pas. Cela peut prêter à confusion si vous ne savez pas sur cette fonctionnalité.
  3. Dans le menu fichier , cliquez sur Enregistrer PageEvent.aspx.
  4. Avec le bouton droit de la page, puis cliquez sur afficher dans le navigateur pour exécuter la page. Notez que l’erreur est levée et signalée conformément aux spécifications du code.
Remarque Vous pouvez remarquer que le code émet un appel à Server.ClearError. Cela empêche l’erreur au gestionnaire d’événements Application_Error .

En outre, vous devez également noter l’attribut Inherits dans la directive @ Page . Si Inherits est définie, vous devez générer le projet avant de naviguer jusqu'à la page. Si vous ne générez pas d’abord le projet, le message d’erreur suivant s’affiche :
'Project.PageEvent' n’est pas un type valide
Retour au début

Comment utiliser la méthode Application_Error

Semblable au gestionnaire d’événements Page_Error , vous pouvez utiliser le Gestionnaire d’événements Application_Error pour intercepter les erreurs qui se produisent dans votre application. En raison de la portée de l’application de l’événement, vous pouvez enregistrer des informations d’erreur application ou gérer d’autres erreurs au niveau de l’application qui peuvent se produire.

L’exemple suivant est basé sur l’exemple de code Page_Error précédent et serait déclenché si l’erreur dans Page_Load n’était pas interceptée dans le Gestionnaire d’événements Page_Error . Le Gestionnaire d’événements Application_Error est spécifié dans le fichier Global.asax de votre application. Pour plus de simplicité, les étapes de cette section créent une page dans laquelle lever l’exception, intercepte l’erreur dans le Gestionnaire d’événements Application_Error du fichier Global.asax et écrivent l’erreur dans le journal des événements. Les étapes suivantes montrent comment utiliser la méthode Application_Error :
  1. Ajouter un nouveau fichier nommé AppEvent.aspx à votre projet.
  2. Ajoutez le code suivant à AppEvent.aspx :
    <script language=C# runat="server">void Page_Load(object sender, System.EventArgs e)
    {
    throw(new ArgumentNullException());
    }
    </script>


    Remarque Les informations présentées dans la section «Page_Error» sur l’attribut AutoEventWireup s’applique également à l’exemple de code dans cette étape. Consultez les informations dans la section «Page_Error» pour plus de détails.
  3. Dans le menu fichier , cliquez sur Enregistrer AppEvent.aspx.
  4. Ajoutez le Gestionnaire d’événements Application_Error dans le fichier Global.asax pour intercepter l’erreur que vous levez dans le Gestionnaire d’événements Page_Load de la page AppEvent.aspx. Notez que vous devez ajouter une autre instruction using pour l’espace de noms System.Diagnostics à Global.asax afin d’utiliser le journal des événements.

    Ajoutez le code suivant au fichier Global.asax :
    using System.Diagnostics;
    protected void Application_Error(object sender, EventArgs e)
    {
    Exception objErr = Server.GetLastError().GetBaseException();
    string err ="Error Caught in Application_Error event\n" +
    "Error in: " + Request.Url.ToString() +
    "\nError Message:" + objErr.Message.ToString()+
    "\nStack Trace:" + objErr.StackTrace.ToString();
    EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error);
    Server.ClearError();
    //additional actions...
    }

  5. Enregistrez le fichier Global.asax.
  6. Dans Visual Studio .NET, dans le menu Générer, cliquez sur Générer.
  7. Avec le bouton droit de la page, puis cliquez sur afficher dans le navigateur. Dans ce cas, la page sera vierge, cependant, vous devriez remarquer qu’une nouvelle entrée a été ajoutée dans le journal des événements. Cet exemple crée une entrée dans le journal de l’Application, qui est accessible à partir de l’Observateur d’événements. Après l’ouverture de l’erreur, vous souhaiterez rediriger l’utilisateur vers une autre page d’erreur plus conviviale ou effectuer des actions supplémentaires si nécessaire.
Retour au début

Comment faire pour utiliser le fichier Web.config

Si vous n’appelez pas Server.ClearError ou l’interruption de l’erreur dans le Page_Error ou Application_Error Gestionnaire d’événements, l’erreur est gérée selon les paramètres dans la section < customErrors > du fichier Web.config. Dans la section < customErrors >, vous pouvez spécifier une page de redirection comme une page d’erreur par défaut (defaultRedirect) ou spécifier une page particulière basée sur le code d’erreur HTTP qui est déclenché. Vous pouvez utiliser cette méthode pour personnaliser le message d’erreur reçu par l’utilisateur.

Si une erreur se produit qui n’est pas interceptée à un des niveaux précédents dans votre application, cette page personnalisée s’affiche. Cette section montre comment modifier le fichier Global.asax afin que Server.ClearError n’est jamais appelé. Par conséquent, l’erreur est gérée dans le fichier Web.config comme ultime point pour intercepter l’erreur.
  1. Ouvrez le fichier Global.asax de l’exemple précédent.
  2. Commentez la ligne Server.ClearError pour s’assurer que les surfaces de l’erreur dans le fichier Web.config.
  3. Enregistrez vos modifications dans Global.asax. Votre code doit désormais apparaître semblable à la suivante :
    using System.Diagnostics;
    protected void Application_Error(object sender, EventArgs e)
    {
    Exception objErr = Server.GetLastError().GetBaseException();
    string err ="Error Caught in Application_Error event\n" +
    "Error in: " + Request.Url.ToString() +
    "\nError Message:" + objErr.Message.ToString() +
    "\nStack Trace:" + objErr.StackTrace.ToString();
    EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error);
    //Server.ClearError();
    //additional actions...
    }

  4. Ajoutez le code suivant à la section < customErrors > pour rediriger l’utilisateur vers une page personnalisée :
    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"></customErrors>

    Remarque Vous devez modifier le chemin d’accès de fichier dans l’attribut defaultRedirect de sorte qu’il référence les noms de serveur et l’application Web appropriées.
  5. Les erreurs interceptées à ce niveau étant envoyées vers une page d’erreur par défaut, vous devez créer une page d’erreur nommée ErrorStatus.htm. Gardez à l’esprit que vous utilisez cette méthode pour contrôler ce qui est présenté à l’utilisateur, afin que cet exemple utilise une page .htm pour la page d’erreur. Ajoutez le code suivant à ErrorStatus.htm :
    <HTML><HEAD>
    <TITLE></TITLE>
    <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0">
    </HEAD>
    <BODY>
    <b>Custom Error page!</b>
    <br>
    You have been redirected here from the <customErrors> section of the
    Web.config file.
    </BODY>
    </HTML>

  6. Pour tester le code, enregistrez les fichiers, générez le projet, puis affichez AppEvent.aspx dans le navigateur. Notez que lorsque l’erreur est levée, vous êtes redirigé vers la page ErrorStatus.htm.
Bien que vous pouvez faire référence à une page d’erreur par défaut dans la valeur de l’attribut defaultRedirect dans la section < customErrors >, vous pouvez également spécifier une page particulière de redirection basée sur le code d’erreur HTTP qui est déclenché. Cette option permet de l’élément enfant de < erreur >. Par exemple :
<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"><error statusCode="404" redirect="filenotfound.htm" />
</customErrors>

Remarque La page spécifiée dans l' attribut defaultRedirect de la section < customErrors > est un fichier .htm. Je

Notez que la section < customErrors > inclut un attribut de mode est défini sur On. L’attribut mode est utilisé pour contrôler la façon dont la redirection de l’erreur se produit. Par exemple, si vous développez l’application, vous probablement pour voir les messages d’erreur ASP.NET réels et ne souhaitez pas être redirigé vers la page d’erreur plus conviviale. L’attribut mode comprend les paramètres suivants :
  • Sur: exceptions non gérées redirigent l’utilisateur vers la page spécifiée defaultRedirect . Ce mode est utilisé principalement durant la production.
  • Désactivé: les utilisateurs reçoivent des informations sur les exceptions et ne sont pas redirigés vers la page defaultRedirect . Ce mode est utilisé principalement en cours de développement.
  • RemoteOnly: seuls les utilisateurs qui accèdent au site sur l’ordinateur local (à l’aide de localhost) reçoivent les informations de l’exception. Tous les autres utilisateurs sont redirigés vers la page defaultRedirect . Ce mode est utilisé principalement pour le débogage.
Retour au début

Résolution des problèmes

Dans son installation par défaut sur Microsoft Windows 2000 et Microsoft Windows XP, ASP.NET exécute le code de l’application Web dans un processus de travail. L’identité de ce processus est par défaut un compte local sans privilège nommé compte ASPNET. Dans les versions bêta d’ASP.NET, l’identité du processus était System, un compte administratif puissant disposant de nombreux privilèges sur l’ordinateur.


Dans son installation par défaut sur Windows Server 2003 (IIS 6), ASP.NET exécute le code de l’application Web dans un processus de travail. L’identité de ce processus est par défaut un compte limité nommé NetworkService.

Pour plus d’informations sur cette modification et comment il peut affecter l’exécution du code dans cet article et autres codes nécessitant des droits d’accès supplémentaires, visitez les sites Web suivants :
Modifications de sécurité version 1 pour le Microsoft.NET Framework
http://msdn2.microsoft.com/en-us/library/ms994923.aspx
Retour au début

Références

Propriétés

ID d'article : 306355 - Dernière mise à jour : 27 janv. 2017 - Révision : 1

Microsoft ASP.NET 1.0, Microsoft Visual C# .NET 2002 Initiation, Microsoft ASP.NET 1.1, Microsoft Visual C# .NET 2003 Initiation

Commentaires