Hi,
Have you ever needed to implement configuration sections for the application configuration file? Well probably you have.
Let's say you want to read the configuration section from your *.config file and send it thru WCF service. The default behavior when working with configuration object is use the System.Configuration namespace that doesn't support WCF.
So the question is what can we do?
A nice solution is to use the IConfigurationSectionHandler interface and mark the section implementation as a DataContract.
It will be something like:
[DataContract]
public class MyConfigurationSectionHandler : IConfigurationSectionHandler
{
#region IConfigurationSectionHandler Members
public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
DataContractSerializer xs = new DataContractSerializer(typeof(MyConfigurationSectionHandler));
using (XmlNodeReader xnr = new XmlNodeReader(section))
{
try
{
var configSection = xs.ReadObject(xnr, false) as MyConfigurationSectionHandler;
if (configSection != null)
{
Applications = configSection.Applications;
}
return this;
}
catch (Exception ex)
{
string s = ex.Message;
Exception iex = ex.InnerException;
while (iex != null)
{
s += "; " + iex.Message;
iex = iex.InnerException;
}
throw new ConfigurationErrorsException(
"Unable to deserialize an object of type \'" + GetType().FullName +
"\' from the < " + section.Name + "> configuration section: " +
s,
ex,
section);
}
}
}
#endregion
[DataMember(Name = "applications")]
public Application[] Applications { get;set; }
}
[DataContract(Name = "application")]
public class Application
{
[DataMember(Name = "name")]
public string Name { get; set; }
}
An example for an appropriate configuration section can be something like:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="MyConfigurationSectionHandler" type="DataContractConfiguration.MyConfigurationSectionHandler, DataContractConfiguration"/>
</configSections>
<MyConfigurationSectionHandler xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/DataContractConfiguration">
<applications>
<application>
<name>App1</name>
</application>
<application>
<name>App2</name>
</application>
</applications>
</MyConfigurationSectionHandler>
</configuration>
Now we can use the ConfigurationManager to get our configuration object that can also be send over the wire using WCF.
MyConfigurationSectionHandler
section = (MyConfigurationSectionHandler)ConfigurationManager.GetSection("MyConfigurationSectionHandler");
I also add small application as an example you can download from here.
Enjoy :-)
Rotem