2015-11-15 40 views
0

我有下面這段代碼寫的WCF客戶端:爲什麼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

回答我自己的問題,差不多一年後。

我最初留下的這個bug以前很少發生,因此無法解決。它最近重新露面,所以我不得不再次深入研究。

正如我發現的那樣,沒有拋出TimeoutException,僅僅是因爲SOAP請求成功完成。超時只有在請求結束後纔會響應,直到響應返回。我驗證了使用小提琴手。但是我的代碼仍然掛着幾個小時。

看來阻塞我的代碼的部分只是對SOAP響應的解析。試圖將特定的響應解析爲XElement時,默認的WCF解析器會永遠懸掛下來。

我在玩弄不同的自定義解析器,並在完成後發佈結果。

0

我以前住過這個兔子洞。我認爲OperationTimeout可能是你要找的。

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

該投射可悲地返回null。我也嘗試了一些不同的東西:myClient.InnerChannel.OperationTimeout = TimeSpan.FromSeconds(5),但也被遺憾地忽略 – Remoba