我有一个WCF客户端,其中包含以下代码:
MyClient myClient = new MyClient();
string id = Guid.NewGuid();
string result = myClient.Foo(id);
Console.WriteLine(result);
这有效,但我想为服务调用添加一个时间限制,因此如果操作时间太长,将抛出异常。我尝试在绑定元素的配置文件中添加超时,如下所示:
<basicHttpBinding>
<binding
receiveTimeout="00:00:05"
sendTimeout="00:00:05"
</binding>
</basicHttpBinding>
这似乎并不令人伤心。
我也尝试在代码文件中手动设置它,如下所示:
MyClient myClient = new MyClient();
myClient.Endpoint.Binding = new BasicHttpBinding()
{
SendTimeout = new TimeSpan(0, 0, 5),
ReceiveTimeout = new TimeSpan(0, 0, 5)
};
string id = Guid.NewGuid();
string result = myClient.Foo(id);
Console.WriteLine(result);
但同样,它似乎无法发挥作用。
我用非常慢的服务测试了它,20分钟后它终于返回了(正确的)答案,但是没有抛出超时异常。
我尝试访问的WCF服务是否可能以某种方式阻止超时?
答案 0 :(得分:0)
我以前一直在这个兔子洞里。我认为OperationTimeout
可能就是你要找的东西。
(myClient as IClientChannel).OperationTimeout = TimeSpan.FromSeconds(5);
答案 1 :(得分:0)
差不多一年之后回答我自己的问题。
我最初没有解决这个错误,因为它过去很少发生。它最近重新出现,所以我不得不再次深入研究它。
正如我发现的那样,没有抛出TimeoutException,只是因为SOAP请求成功完成。只有在请求结束时才会响应超时,直到响应返回为止。我验证了使用小提琴手。但我的代码仍然挂了好几个小时。
看来阻止我的代码的部分只是解析SOAP响应。当尝试将特定响应解析为XElement时,默认的WCF解析器就会永远挂起。
我正在使用不同的自定义解析器,并在完成后发布结果。