Reputation: 113
I'm using WCF in communication between a server and client (both written in C#).
In release-mode, the timouts should be set to ~20 seconds, but in debug mode I want to set them to a higher value so that I can debug/step in my code without the timeout occurring.
I know that I can change the timeouts by modifying the app.config file. However, I've got two different bindings and 4 time out values in each so I would have to change in several places, and its easy to forget.
To solve this, I would like to have a small #if DEBUG-section in my code which programmatically changes the timeout values to 1 hour.
I tried to use the following code to do this:
Configuration configuration =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ServiceModelSectionGroup serviceModel =
ServiceModelSectionGroup.GetSectionGroup(configuration);
BindingsSection bindings = serviceModel.Bindings;
foreach (var configuredBinding in bindings.WSHttpBinding.ConfiguredBindings)
{
configuredBinding.CloseTimeout = new TimeSpan(0, 30, 0);
configuredBinding.OpenTimeout = new TimeSpan(0, 30, 0);
but the *Timeout properties are readonly so I get a compilation error.
I'm not fond of the idea of creating bindings from scratch programmatically. If I change some of the attributes in the app.config, I have to remember to do the same change in the code to make sure that the debug-behavior is similar to the release-behavior (except for the timeouts..)
How to handle this?
Upvotes: 11
Views: 12777
Reputation: 754868
You could do the following:
Something like:
BasicHttpBinding myBinding = new BasicHttpBinding("ConfigName");
myBinding.CloseTimeout = .......
myBinding.OpenTimeout = .......
myBinding.ReceiveTimeout = .......
myBinding.SendTimeout = .......
EndpointAddress myEndpoint = new EndpointAddress("http://server:8181/yourservice");
YourServiceClient proxy = new YourServiceClient(myBinding, myEndpoint);
That way, you can leverage the basic config when describing binding timeouts and yet you can tweak the settings you want and create your client proxy from it.
Upvotes: 16
Reputation: 31
You can create a second binding in the web.config and set a longer sendTimeout.
if (debug)
{
proxy = new MyClient("WSHttpBinding_MyLocal");
}
else
{
proxy = new MyClient("WSHttpBinding_MyDev");
}
<wsHttpBinding>
<binding name="WSHttpBinding_MyLocal" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:20:00"
...
Upvotes: 3