Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    View Cyril Durand's profile on LinkedIn

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.

Capture 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 ;-)

Posted: samedi 22 mars 2008 02:21 par cyril
Classé sous : , ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

crazyht a dit :

Juste histoire de ramener ma fraise : Je pense qu'il faut preferait l'instruction as au Cast :

HttpHandlersSection section =

   ConfigurationManager.GetSection(@"system.web/httpHandlers") as HttpHandlersSection;

@++

Hervé

# mars 22, 2008 08:45

cyril a dit :

Quelle interêt d'utiliser as ? GetSection nous renverra null s'il ne trouve pas la section, il y a fort peu de chance que HttpHandlerSection soit remappé vers autre chose et qu'une autre section prenne sa place, il faudrait faire des modifs au niveau du machine.config ce que personne ne fait et si c'était le cas, faut pas se plaindre que ca plante ... :p

# mars 22, 2008 13:35
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Changements au niveau du Garbage Collector dans ".NET 3.5" par CoqBlog le il y a 4 heures et 2 minutes

- IIS et ASP.net 3.5 : avoir la bonne version du framework par Atteint de JavaScriptite Aiguë [Cyril Durand] le il y a 4 heures et 17 minutes

- James Whittaker parle de Software Testing par Etienne Margraff le il y a 10 heures et 36 minutes

- [CSS3] A quoi ressemblera box-shadow ? par Le blog de FremyCompany le il y a 10 heures et 37 minutes

- Besoin d'icones/images pro pour vos sites et applications ? par Nix's Blog le il y a 12 heures et 9 minutes

- EMPLOI : WebCast à visionner absolument pour répondre à différentes questions qu'on peut avoir sur le marché français par Blog Technique de Romelard Fabrice le il y a 13 heures et 34 minutes

- XBOX : L'uniformisation du système d'achat de ZUNE et XBOX Live par Blog Technique de Romelard Fabrice le il y a 16 heures et 14 minutes

- Aventures avec le mot clé "let" dans LINQ to Objects par Jerome Laban le 05-10-2008, 17:35

- Et encore un nouveau blog sur Codes-Sources ! par Blog Technique d'Audrey PETIT le 05-09-2008, 21:14

- Rosario - Team Foundation Server - MSBuild + Workflow Foundation par Azra [Florent Santin] le 05-09-2008, 19:00