DayPath Journal

Loading .NET configuration files as XDocument instances

There is the general-purpose ConfigurationManager but there is also the HTTP-context-specific WebConfigurationManager. An answer on StackOverflow.com strongly suggests that WebConfigurationManager.OpenWebConfiguration() will be needed to read settings from any other Web.config file than the site default. This is not the case: settings appear in memory hierarchically. So a child Web app has already loaded the settings of its parent (all the way down to machine.config). This fact can explain why all of the MSDN samples for WebConfigurationManager.OpenWebConfiguration() load Web.config from a child web app as child Web.config data would not already be loaded in a parent context.

Now it is possible to use WebConfigurationManager.OpenWebConfiguration() to load a config file on a remote server. But this operation is technically in the context of Remote Administration and requires enabling this feature in IIS. So this single statement requires a lot of work:

var config = WebConfigurationManager.OpenWebConfiguration(null, "dev.site.com", null, "REMOTE.ONE.AD");
    

…when all you want to do is this:

var d = XDocument.Load(@"\\REMOTE.ONE.AD\www\Web.config");
    

…which loads a remote Web.config file as an XDocument (works fine for development while running Visual Studio as Administrator as long as your account has the file permissions). This statement can be used as a last resort or a fallback when, say, appSettings returns null for a particular key. So your Web app can first look at the settings loaded in memory from any parent Web.config with the option of falling back to an XDocument.

This XDocument fallback technique looks like a replacement for the file attribute declaration:

<appSettings file="\\REMOTE.ONE.AD\fragments\appSettings.config" />
    

…where appSettings.config is not a full configuration file—it would have a root element appSettings). The documentation for this declaration insists that the path must be relative but experience shows me that absolute paths work—even UNCs. To further summarize, distract and confuse, it must be mentioned that file declaration is not the same as configSource attribute declaration (see MSDN).