2011-07-06 74 views
21

通常,如果WCF端點不可用(在我的情況下,通常是因爲服務主機未運行),我會在超時後收到EndpointNotFoundException。我想有一個快速的方式來查詢服務,看看它是否可用,而不必依賴於正常的超時。換句話說,我想在正常情況下保持正常的超時,但爲了快速「ping」端點,我希望它在不能立即可用的情況下快速失敗。最快的方法來檢查WCF端點是否正在偵聽

這怎麼可能完成?

回答

8

您將不得不等待TimeOut異常。您可以在創建代理對象時設置(覆蓋)TimeOut。它們很便宜,因此爲Ping提供臨時代理。

在服務器端,你可以確保有一個輕量級的函數來調用(比如GetVersion)。

+3

回頭,當我在做WCF時,我只是用了一個'void Ping()'; p –

4

要檢查可用性,您可以嘗試連接到主機通Socket連接 這樣的(其vb.net 2.0的代碼應該在WCF工作太)

Dim sckTemp As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) 
    sckTemp.ReceiveTimeout = 500 : sckTemp.SendTimeout = 500 

    Try 
     '' Connect using a timeout (1/2 second) 
     Dim result As IAsyncResult = sckTemp.BeginConnect("Host_ADDRESS", YOUR_SERVER_PORT_HERE, Nothing, Nothing) 
     Dim success As Boolean = result.AsyncWaitHandle.WaitOne(500, True) 
     If (Not success) Then 
      sckTemp.Close() : Return False 
     Else 
      Return True 
     End If 
    Catch ex As Exception 
     Return False 
    End Try 

它會給你在1/2服務器狀態秒

+0

這看起來很有前途。公平地說,我沒有提到我的完整配置,但我正在使用端口共享。很高興在這裏有另一種方法。 – Larsenal

+0

發生併發訪問時會出現問題,請在ForAll並行方法上進行測試以查看 – Alexandre

2

這是您要更改的SendTimeout。 在我的特殊情況下,這是一個FedEx套餐評級服務,偶爾總是似乎在週五晚上下降。您可能必須仔細考慮超時值,具體取決於漏報(服務被關閉)的重要性。

rateService.Endpoint.Binding.SendTimeout = TimeSpan.FromSeconds(.5); 

此值只會影響WCF客戶端,並不會永久更改該服務的超時。

相關問題