通常,如果WCF端點不可用(在我的情況下,通常是因爲服務主機未運行),我會在超時後收到EndpointNotFoundException。我想有一個快速的方式來查詢服務,看看它是否可用,而不必依賴於正常的超時。換句話說,我想在正常情況下保持正常的超時,但爲了快速「ping」端點,我希望它在不能立即可用的情況下快速失敗。最快的方法來檢查WCF端點是否正在偵聽
這怎麼可能完成?
通常,如果WCF端點不可用(在我的情況下,通常是因爲服務主機未運行),我會在超時後收到EndpointNotFoundException。我想有一個快速的方式來查詢服務,看看它是否可用,而不必依賴於正常的超時。換句話說,我想在正常情況下保持正常的超時,但爲了快速「ping」端點,我希望它在不能立即可用的情況下快速失敗。最快的方法來檢查WCF端點是否正在偵聽
這怎麼可能完成?
您將不得不等待TimeOut異常。您可以在創建代理對象時設置(覆蓋)TimeOut。它們很便宜,因此爲Ping提供臨時代理。
在服務器端,你可以確保有一個輕量級的函數來調用(比如GetVersion)。
要檢查可用性,您可以嘗試連接到主機通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服務器狀態秒
這是您要更改的SendTimeout
。 在我的特殊情況下,這是一個FedEx套餐評級服務,偶爾總是似乎在週五晚上下降。您可能必須仔細考慮超時值,具體取決於漏報(服務被關閉)的重要性。
rateService.Endpoint.Binding.SendTimeout = TimeSpan.FromSeconds(.5);
此值只會影響WCF客戶端,並不會永久更改該服務的超時。
回頭,當我在做WCF時,我只是用了一個'void Ping()'; p –