2013-07-29 46 views
0

我正在開發一個VS2010 Dotnet 4.0客戶端到一個運行嵌入式Linux的設備(Pelco品牌的視頻圓頂,因爲它發生)的SOAP服務。我無法控制設備中的SOAP服務器。供應商提供了正確加載爲服務引用的WSDL文件。檢測或避免客戶端CommunicationException當服務器關閉保持活動http連接

我正在使用命令行桌面客戶端來解決這個問題(在將代碼遷移到服務之前)。

簡化了一下,在各種服務的SOAP調用採取的形式是這樣的:

service.SetPosition(pan,tilt,zoom) 
var pos = service.GetPosition(); 

等等。他們基本上工作和做預期的事情。

問題是這樣的:曾經在一段時間,間歇性,帶有圖案我還沒有(還)想通了,這些服務的一個隨機調用將引發的CommunicationException其消息是

The underlying connection was closed: A connection that was 
expected to be kept alive was closed by the server. 

這裏的我如何構造我的服務對象:

var binding = new System.ServiceModel.BasicHttpBinding(); 
    uri = new Uri(/*the correct uri for the service*/); 
    address = new System.ServiceModel.EndpointAddress(u); 
    service = new PositioningControlPortTypeClient(binding, address); 

在這種情況下,PositioningControlPortTypeClient被通過WSDL定義,當我加載它作爲一個服務引用。

有沒有辦法強制dotnet 4.0/wcf/soap使用HTTP/1.0?

有沒有辦法檢測到我的服務客戶端在拋出異常之前會拋出異常?

我應該只使用每個服務對象一次,然後處理它嗎?

還有其他的智慧嗎?

回答

1

你可以嘗試禁用保活在你的綁定:

var binding = new System.ServiceModel.BasicHttpBinding(); 
    uri = new Uri(/*the correct uri for the service*/); 
    address = new System.ServiceModel.EndpointAddress(u); 
    CustomBinding cbinding = new CustomBinding(binding); 
    foreach (BindingElement be in cbinding.Elements) 
    { 
     if (be is HttpTransportBindingElement) ((HttpTransportBindingElement)be).KeepAliveEnabled = false; 
    } 
    service = new PositioningControlPortTypeClient(cbinding, address); 
+0

完美,謝謝。 –

相關問題