我正在开发一个使用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获取或设置在传输引发异常之前完成写入操作所需的时间间隔。
因此,如果不需要,我宁愿不改变这个值。
答案 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;