views:

591

answers:

4

I have to duplicate some settings (like connection string) between a web.config file that a WCF host uses and a web.config file that a web client uses.

In the interest of not duplicating, can I have both the web.configs read from a separate xml file? The two web.configs can be entirely in different solutions/projects so I guess this is not possible, but wanted to get other's opinion.

PS: I do understand I can use a database to store all the config settings.

+1  A: 

if you can, just put the configurations in common in the Machine.Config. They both can read from there, and each web.config can override any values you need.

I say if you can, because I know that many hosting companies won't let you modify it unless you are renting a dedicated server.

Kevin
A: 

you can specify your connectionstrings outside of your web.config http://blog.andreloker.de/post/2008/06/Keep-your-config-clean-with-external-config-files.aspx but it has to be in the same directory.

ram
no, doesn't have to be the same directory. You can easily write:<connectionStrings configSource="config\prod\connectionStrings.config" />. NO problem at all.
marc_s
Then here he goes. put that in a separate file and share it between web.configs of different applications !!
ram
+2  A: 

Yes, any configuration section can be "externalized" - this includes things like <appSettings>, <connectionStrings> and many more.

You'd have something like this in your web.config:

<configuration>
   <appSettings configSource="appSettings.config" />   
   <connectionStrings configSource="connectionStrings.config" />
   <system.web>    
      <pages configSource="pages.config" />
      <httpHandlers configSource="httphandlers.config">
   </system.web>    
</configuration>

The externalized config's would just contain that one subsection in them:

httphandlers.config:

<httpHandlers>
    <remove verb="*" path="*.asmx"/>
    <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
</httpHandlers>

Note you cannot externalize the entire <system.web> part, since that is a configuration section group - not a configuration section - but you can externalize most of the sub-sections contained in system.web.

marc_s
Where should the httphandlers.config be located? It's possible that the projects that are sharing this config file is on a domain
DotnetDude
@DotnetDude: if you don't specify a path, the httpHandlers.config would have to be in the same place as the web.config. You can specify subpaths, e.g. configSource="config\httpHandlers.config" to put all your config files in one place. To share amongst multiple projects, either copy to different project location, or do stuff like symbolic links on the operating system level to make one physical file show up in various directory locations
marc_s
+2  A: 

A config file can point to other config files as long as the files are in the same path (including subdirectories).

Here is an example of my config settings:

<connectionStrings configSource="web\config\connectionStrings.config" />
<appSettings configSource="web\config\appSettings.config" />
<system.diagnostics configSource="web\config\diagnostics.config" />
<system.serviceModel>
    <bindings configSource="web\config\serviceModelBindings.config" />
    <behaviors configSource="web\config\serviceModelBehaviors.config" />
    <services configSource="web\config\serviceModelServices.config" />
    <client configSource="web\config\serviceModelClient.config" />
</system.serviceModel>

In my case, I have several windows applications in a root folder which include a web application as a subfolder. This allows each application's config file to point to the shared configs.

Tom Brothers