views:

59

answers:

3

I've got a Visual Studio project that recently started throwing a ConfigurationErrorsException, and I can't figure out where it's coming from. I've hunted high and low, can't find anything like the error, and it doesn't appear for any of my teammates when they run the project on their PCs.

Does anyone have any specific advice on how to debug the loading and parsing of config files? Since the ConfigurationManager is framework code, I don't have the source and can't step into it with the Visual Studio debugger, so I'm hunting around in the dark.

I'd dearly love to be able at least to see which files are loaded, what sections, keys, etc. are retrieved, and what values are overridden when subsequent config files load.

Just FYI, the project is an InfoPath form project edited in Visual Studio 2008, using .NET 3.5. The exception happens when the form is first loading; a method tries to get a Web Service URL from the config file:

_clmWebSrvc.Url = System.Configuration.ConfigurationSettings.AppSettings["CLMUtilityWebServiceUrl"];

which fails (only for me!) with:

System.Configuration.ConfigurationErrorsException
The configuration section 'connectionStrings' has an unexpected declaration.
   at System.Configuration.ConfigurationManager.get_ConnectionStrings()

I can't find a connectionStrings section anywhere; there used to be a default one in machine.config, but I removed it long ago as it caused conflicts in some of the web apps I maintain. There's nothing of the sort in Infopath.exe.config, nor in any other config file that would be in the inheritance chain. I stopped the separate web site I had running in local IIS. I reinstalled VS2008, InfoPath, cleared the InfoPath FormCache, renamed my user profile and restarted my PC, logged in as a totally different user, all to no effect.

As you can see, these are all clumsy, desperate attempts to find out what config files affect the app. What I really want is a utility that will show me exactly what's being loaded. Is there any such animal?

Thanks!

+1  A: 

Check out Process Monitor from System Internals (MSFT). You should filter it on your process, which will allow you to see what files it is trying to open, and where it is looking.

Then, you can also employ Red Gate .NET Reflector, which will let you step into .NET classes such as ConfigurationManager so that you can debug right down to the actual source of the exception being thrown.

Mike Atlas
I knew about Process Monitor, which was my next step -- at least it shows me the files in use -- but not .NET Reflector. Thanks loads for the tip; off to download them!
Val
@Mike, your comment to @Joe's answer is correct -- you provided the best way to see what's going on. I even stated my actual problem as an aside, as I was asking for a general solution. Sorry -- I was very focused on the real problem, the tools were just a way to get there. I will say, tho, that .NET Reflector didn't work for me -- kept crashing, and then I gave up when I added the section back to machine.config. Anyway, thanks for setting me straight!
Val
+1  A: 

A response but maybe not answer to your problem is to download the symbol files for .NET (which, of course, includes your Configuration assembly).

I can't remember if it's pre-filled in the Debug options in 2008, but here's a Hanselman post just in case: .NET Framework Library Source Code available for viewing

Marc
Pretty cool -- but it seems to require that you get *past* the .NET call and back into your own code, so that you can use the Call Stack window to load the .NET symbols. Then in subsequent calls you can step into the .NET code. I'm stuck because there's no previous, working call to ConfigurationManager; by the time it gets hit, the exception is immediately thrown.
Val
+1  A: 

This error can be thrown if the connectionStrings section is missing.

Your mistake was removing the connectionStrings section from machine.config - some parts of the .NET Framework require this section to be present.

You should not manually modify machine.config. Instead, any apps that are having problems should use

<connectionStrings>
    <clear/>
</connectionStrings>

which will clear any connection strings that have been defined in machine.config.

Joe
That worked -- thanks! I'd taken that section out long ago; it fixed some problems at the time, but came back to bite me.
Val
Sad to see that you accepted this as the correct answer - while it was the way to correct your problem, you simply asked how to best debug your problem, not what could be causing it. A bit pedantic, I know, but my answer is probably more helpful in general and this answer more helpful only for this very specific error message.
Mike Atlas