ClientBase EndPoint绑定SendTimeout ReceiveTimeout:调试时如何更改

时间:2016-11-11 13:34:49

标签: c# wcf

我正在开发一个使用WCF服务的解决方案和一个使用该服务的客户端。有时我正在调试服务,有时是客户端,有时是两者。

在调试期间,我得到一个带有附加信息的TimeoutException

附加信息:请求频道在00:00:59.9950000之后等待回复时超时。增加传递给Request的调用的超时值或增加Binding上的SendTimeout值。分配给此操作的时间可能是较长超时的一部分。

当然我的服务器在断点处等待而不是回答问题的原因。

在调试期间,我希望更长时间超时,最好不要为我的服务客户端创建新配置,因为如果此配置的其他值发生更改,则更换器必须记住已创建用于调试的特殊配置。

我认为它类似于:

private IMyServiceInterface CreateServiceChannel()
{
    var myServiceClient = new MyServiceClient(); // reads from configuration file
    if (Debugger.IsAttached)
    {
        // Increase timeouts to enable slow debugging
        ...
    }
    return (IMyServiceInterface)myServiceClient;
}

根据MSDN Binding.SendTimeout Property用于其他内容:

  

SendTimeout获取或设置在传输引发异常之前完成写入操作所需的时间间隔。

因此,如果不需要,我宁愿不改变这个值。

  • SendTimeout真的是最好的超时增加,还是有像TransactionTimeout,我的问题和收到答案之间的超时?
  • 如何以编程方式更改超时

1 个答案:

答案 0 :(得分:1)

文章All WCF timouts explained指出确实有类似事务超时: IContextChannel.OperationTimeout

  

操作超时包括整个服务调用(发送请求,处理请求和接收回复)。换句话说,它从客户端的角度定义了服务调用处于活动状态的最长时间。如果未设置,WCF将使用配置的发送超时初始化操作超时。

这解释了为什么抛出的TimeoutException建议更改发送超时。

但是,可以在不更改发送超时的情况下更改操作超时:

var myServiceClient = new MyServiceClient(); // reads from configuration file

if (Debugger.IsAttached)
{   // Increase timeouts to enable slow debugging:
    IContextChannel contextChannel = (IContextChannel)myServiceClient.InnerChannel;
    // InnerChannel is of type IClientChannel, which implements IContextChannel

    // set the operation timeout to a long value, for example 3 minutes:
    contextChannel.OperationTimeout = TimeSpan.FromMinutes(3);
}
return (IMyInterface)myService;