为什么忽略WCF客户端超时

时间:2015-11-15 18:26:41

标签: c# .net wcf timeout basichttpbinding

我有一个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服务是否可能以某种方式阻止超时?

2 个答案:

答案 0 :(得分:0)

我以前一直在这个兔子洞里。我认为OperationTimeout可能就是你要找的东西。

(myClient as IClientChannel).OperationTimeout = TimeSpan.FromSeconds(5);

答案 1 :(得分:0)

差不多一年之后回答我自己的问题。

我最初没有解决这个错误,因为它过去很少发生。它最近重新出现,所以我不得不再次深入研究它。

正如我发现的那样,没有抛出TimeoutException,只是因为SOAP请求成功完成。只有在请求结束时才会响应超时,直到响应返回为止。我验证了使用小提琴手。但我的代码仍然挂了好几个小时。

看来阻止我的代码的部分只是解析SOAP响应。当尝试将特定响应解析为XElement时,默认的WCF解析器就会永远挂起。

我正在使用不同的自定义解析器,并在完成后发布结果。