Je me suis retrouvé récemment face à un doute technique. Après avoir longuement expliqué l’intérêt de mettre des traces dans les différents événements d’une page ou d’un contrôle ASP.NET et l’importance de conditionner ces traces pour ne pas les retrouver dans l’environnement de production, je me suis retrouvé coincé car la technique a changé entre ASP.NET 1.x et ASP.NET 2.0. Explication…
Dans ma page, je mets les traces souhaitées :
#if TRACE
Context.Trace.Write("MaPage", "Début de l'événement OnLoad");
#endif
Les pages et les contrôles ASCX étant compilés dynamiquement à l’exécution, il est inutile de mettre une directive de compilation dans votre projet (sauf si vous utilisez la fonctionnalité de publication avec les pages précompilées et non updateable).
En 1.x, j’avais l’habitude de configurer la directive dans la section <compilation/> du web.config :
<compilation debug="true" compilerOptions="/d:TRACE">
Là, l’intellisense ne me propose pas l’attribut CompilerOptions ce qui m’est confirmé par une erreur au runtime. Un petit tour sur la toile pour comprendre que la compilation est plus complexe (fine) en ASP.NET 2.0.
Heureusement, il existe toujours cette configuration dans la directive de page, ce qui n’est pas plus mal d’ailleurs pour restreindre le scope de la directive de compilation :
<%@Page Language="C#" CompilerOptions="/d:TRACE" %>
Pour ceux qui souhaitent utiliser la directive pour l’ensemble du site, il faut vous tourner vers la section de configuration <system.codeDom> où on doit déclarer des <compilers> avec leurs paramètres pour des jeux de fichiers du site. dans l’exemple ci-dessous, on définit que les fichier .cs seront compilés via un CSharpCodeProvider (csc.exe) avec la directive TRACE.
<system.codedom>
<compilers>
<compiler
language="c#;cs;csharp" extension=".cs"
compilerOptions="/d:TRACE"
type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</compilers>
</system.codedom>
Attention toutefois avec cette méthode car le site doit être exécuté en FullTrust pour avoir accès aux options de compilation.
Merci à Scott Allen pour les explications.