Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I specify an alternate config file for a WCF client?

I am working on a large system, for which I have to use WCF to access a web service. My test code works fine, now I need to integrate my WCF client code into the larger system. I cannot add to the existing 'app.config' file, and would like specify a separate .config file for use by my client code.

How best can I accomplish this?

Thanks!

like image 927
Jay Avatar asked Oct 21 '09 03:10

Jay


3 Answers

There are 2 options.

Option 1. Working with channels.

If you are working with channels directly, .NET 4.0 and .NET 4.5 has the ConfigurationChannelFactory. The example on MSDN looks like this:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "Test.config";
Configuration newConfiguration = ConfigurationManager.OpenMappedExeConfiguration(
    fileMap,
    ConfigurationUserLevel.None);

ConfigurationChannelFactory<ICalculatorChannel> factory1 = 
    new ConfigurationChannelFactory<ICalculatorChannel>(
        "endpoint1", 
        newConfiguration, 
        new EndpointAddress("http://localhost:8000/servicemodelsamples/service"));
ICalculatorChannel client1 = factory1.CreateChannel();

As pointed out by Langdon, you can use the endpoint address from the configuration file by simply passing in null, like this:

var factory1 = new ConfigurationChannelFactory<ICalculatorChannel>(
        "endpoint1", 
        newConfiguration, 
        null);
ICalculatorChannel client1 = factory1.CreateChannel();

This is discussed in the MSDN documentation.

Option 2. Working with proxies.

If you're working with code-generated proxies, you can read the config file and load a ServiceModelSectionGroup. There is a bit more work involved than simply using the ConfigurationChannelFactory but at least you can continue using the generated proxy (that under the hood uses a ChannelFactory and manages the IChannelFactory for you.

Pablo Cibraro shows a nice example of this here: Getting WCF Bindings and Behaviors from any config source

like image 152
Philippe Avatar answered Sep 25 '22 03:09

Philippe


you can't do this as you like - you can come close, but can't do it totally.

What you could do is add this section to the main app's config file:

<system.serviceModel>
   <bindings configSource="bindings.config" />
   <behaviors configSource="behaviors.config" />
   <client configSource="client.config" />
   <services configSource="services.config" />
  .....
</system.serviceModel>

So for each section inside <system.serviceModel>, you could specify an external config file by using the configSource= attribute (and don't let Visual Studio's red squiggly lines confuse it - yes, it DOES work!).

You can do this for any configuration section - but unfortunately, there's no way to do this for the whole section group (<system.serviceModel>).

Marc

like image 36
marc_s Avatar answered Sep 24 '22 03:09

marc_s


There is no built-in support for this in WCF unfortunately. You must create your own ChannelFactory subclass and load/parse configuration files yourself. Check out this post here on MSDN forums for more implementation details.

like image 38
Drew Marsh Avatar answered Sep 25 '22 03:09

Drew Marsh