以编程方式在调试模式下设置WCF超时

时间:2009-12-01 14:07:10

标签: wcf configuration timeout

我在服务器和客户端之间的通信中使用WCF(都是用C#编写的)。

在发布模式下,时间应设置为~20秒,但在调试模式下,我想将它们设置为更高的值,以便我可以调试/插入代码而不会发生超时。

我知道我可以通过修改app.config文件来更改超时。但是,我有两个不同的绑定和4个超时值,所以我不得不在几个地方改变,很容易忘记。

要解决这个问题,我想在我的代码中有一个小的#if DEBUG-section,它以编程方式将超时值更改为1小时。

我尝试使用以下代码执行此操作:

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);

但是* Timeout属性是只读的,所以我得到了一个编译错误。

我不喜欢以编程方式从头开始创建绑定的想法。如果我更改了app.config中的一些属性,我必须记住在代码中进行相同的更改,以确保调试行为类似于发布行为(超时除外)。

如何处理?

2 个答案:

答案 0 :(得分:13)

您可以执行以下操作:

  • 在代码中创建绑定和端点
  • 在绑定实例上设置超时
  • 然后使用这两个元素创建客户端代理

类似的东西:

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);

这样,您可以在描述绑定超时时利用基本配置,但您可以调整所需的设置并从中创建客户端代理。

答案 1 :(得分:2)

您可以在web.config中创建第二个绑定,并设置更长的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"

...