为什么忽略 WCF 客户端超时

Why is the WCF Client timeout ignored

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

我以前去过这个兔子洞。我想 OperationTimeout 可能就是您要找的。

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

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

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

据我所知,没有抛出 TimeoutException,仅仅是因为 SOAP 请求成功完成。只有从请求发出到响应 returns 的那一刻,超时才会被接受。我验证了使用提琴手。但是我的代码仍然挂了好几个小时。

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

我正在尝试使用不同的自定义解析器,我会在完成后 post 结果。