Lire un paramètre du fichier de config | web.config ou app.config
Bien souvent on aimerait connaitre la valeur d'un élément de la configuration actuelle, par exemple la page d'erreur par défaut, la liste des handlers configurés etc...
C'est exactement la question que j'ai vu sur le forum ASP.net tout à l'heure.
L'astuce est simple mais encore faut il la connaitre. Pour récupérer les paramètres stocké dans le web.config (ou app.config), il faut passer par la classe ConfigurationManager et sa méthode statique GetSection.
Par exemple pour obtenir tous les handlers configurés sur l'application web :
HttpHandlersSection section =
(HttpHandlersSection)ConfigurationManager.GetSection(@"system.web/httpHandlers");
gvHandler.DataSource = section.Handlers;
gvHandler.DataBind();
Ce qui nous génère :
| Path |
Verb |
Type |
Validate |
LockItem |
| *.rules |
* |
System.Web.HttpForbiddenHandler |
|
|
| *_AppService.axd |
* |
System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 |
|
|
| ScriptResource.axd |
GET,HEAD |
System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 |
|
|
| *.xoml |
* |
System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 |
|
|
| *.svc |
* |
System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 |
|
|
| trace.axd |
* |
System.Web.Handlers.TraceHandler |
|
|
| WebResource.axd |
GET |
System.Web.Handlers.AssemblyResourceLoader |
|
|
| *.axd |
* |
System.Web.HttpNotFoundHandler |
|
|
| *.aspx |
* |
System.Web.UI.PageHandlerFactory |
|
|
| *.ashx |
* |
System.Web.UI.SimpleHandlerFactory |
|
|
| *.asmx |
* |
System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 |
|
|
| *.rem |
* |
System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 |
|
|
| *.soap |
* |
System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 |
|
|
| *.asax |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.ascx |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.master |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.skin |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.browser |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.sitemap |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.dll.config |
GET,HEAD |
System.Web.StaticFileHandler |
|
|
| *.exe.config |
GET,HEAD |
System.Web.StaticFileHandler |
|
|
| *.config |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.cs |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.csproj |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.vb |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.vbproj |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.webinfo |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.licx |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.resx |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.resources |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.mdb |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.vjsproj |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.java |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.jsl |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.ldb |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.ad |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.dd |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.ldd |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.sd |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.cd |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.adprototype |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.lddprototype |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.sdm |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.sdmDocument |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.mdf |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.ldf |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.exclude |
* |
System.Web.HttpForbiddenHandler |
|
|
| *.refresh |
* |
System.Web.HttpForbiddenHandler |
|
|
| * |
GET,HEAD,POST |
System.Web.DefaultHttpHandler |
|
|
| * |
* |
System.Web.HttpMethodNotAllowedHandler |
|
|
Ce qu'il y a d'intéressant avec cette technique c'est que cela ne récupère pas seulement les informations du web.config mais également les informations du machine.config et les valeurs par défaut.
Pour bien comprendre cette astuce, il faut voir un fichier de config comme un ensemble de section. Toutes les sections sont désérialisées et stockées en mémoire lors de l'initialisation de l'application. ConfigurationManager.GetSection nous permet d'accèder à cette configuration stockée en mémoire. Bien sur cette astuce fonctionne avec tous les fichiers de config .net pas seulement le web.config.
Pour voir toutes les sections disponibles nativement, rendez vous dans le machine.config (%windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG), vous pouvez également créer vos propres sections.
A partir de là je me suis posé une question. Avec ASP.net il est possible d'avoir des fichiers de configuration au niveau d'un dossier, par exemple pour avoir un page d'erreur différente en fonction du dossier de la requête.
Je me suis donc créé un mini site web (voir capture à gauche), chaque web.config possède une page d'erreur personnalisée différente.
Lorsque je vais dans une des pages, j'ai la bonne valeur qui m'est retourné, c'est à dire si je vais sur /folder1/Default.aspx j'ai la valeur configuré dans /folder1/Web.config.
ConfigurationManager.GetSection nous retourne les valeurs en fonction de la requête active.
Voici le code pour afficher la page d'erreur personnalisée par défaut.
CustomErrorsSection section =
(CustomErrorsSection)ConfigurationManager.GetSection(@"system.web/customErrors");
lblDefaultRedirect.Text = section.DefaultRedirect;
Si vous devez obtenir une valeur de votre web.config, inutile d'essayer de le parser ou je ne sais quelle autre bidouille ;-)