2010-05-19 55 views
4

我將有一個客戶端應用程序使用WCF服務的代理。這個客戶端將是一個Windows窗體應用程序,在一個地址處對N個端點進行basicHttpBinding。是否有檢查WCF服務是否在線的示例?

我要解決的問題是,當任何Windows窗體應用程序會通過互聯網來獲取必須有我的Web服務器在線將需要了解這個特殊的WCF服務是在線我的Web服務器。我需要一個例子,說明後臺線程上的這個客戶端如何能夠對「WCF服務......,你在那裏?」進行輪詢。這樣,我們的客戶端應用程序就可以在客戶端投入大量時間來建立客戶端工作之前通知客戶端,只會讓WCF服務處於脫機狀態而感到沮喪。

我再次尋找一種簡單的方法來檢查WCF服務「你在嗎?」

回答

11

這是什麼癡迷檢查這些服務是否存在?

只需撥打服務和任何防禦性編程課程會教你,準備好處理異常。

真的沒有好處在不斷髮送「你在嗎?」請求所有的線...

即使你可能有類似於Ping()方法(它只是返回一個固定的值或什麼 - 你的服務名稱或其他) - 只檢查你的服務是否可達 - 那怎麼辦您需要查詢以獲取數據的數據庫?你的服務方法依賴於其他服務呢?它變得非常混亂,非常非常棘手,想辦法檢查所有這些 - 只是爲了看看它是否在那裏。

簡而言之:不,沒有可靠和有意義的方法來檢查給定的服務是否「存在」和「活着」 - 只需調用它!並準備處理失敗 - 它有時失敗....

+2

是的,服務層之外可能存在問題..,同意。我不認爲你應該明白這一點,即向客戶提供一個早期信號,告訴他們不在線,這樣他們就不會離線工作,最終只會感到沮喪。就持久性而言,如果我們至少可以達到服務層,那麼我們就擁有處理該異常的方法。我需要一個解決方案來解決這個問題,並且我目前還沒有解決一系列額外的潛在問題。 – apolfj 2010-05-19 16:40:45

+0

也只是創建一個ping方法可以工作。我想知道WCF管道是否有內置的這個動作呢? – apolfj 2010-05-19 16:41:58

+0

@apolfj:不,WCF運行時沒有任何東西來檢查服務可用性,據我所知。我們有一種像Ping()方法 - 稱爲Version() - 它返回服務版本(來自程序集) - 但我們的客戶端真的從來不會調用該方法... – 2010-05-19 16:43:36

5

檢查服務是否存活沒有價值。絕對沒有。爲什麼?

if(serviceIsAlive()) 
{ 
    callService(); 
} 
else 
{ 
    handleFailure() 
} 

您是否看到此代碼段的問題?如果在檢查服務是否存在以及您打電話給服務器的時間之間發生了什麼,服務會停止?這是一個競賽條件,還有一個等待發生的錯誤。所以,你需要做的,即使你可以檢查服務的條件是什麼,就是:

if(serviceIsAlive()) 
{ 
    try 
    { 
     callService(); 
    } 
    catch(CommunicationException) 
    { 
     handleFailure(); 
    } 
} 
else 
{ 
    handleFailure(); 
} 

但在這個塊中,handleFailure()調用是在兩個不同的地方 - 我們有兩個不同的路徑來處理相同的錯誤條件 - 這看起來是一件壞事。因此,這可以安全地簡化爲:

try 
{ 
    callService(); 
} 
catch(CommunicationException) 
{ 
    handleFailure(); 
} 
+1

同意totaly。我們得出同樣的結論:驗證服務是否已啓動的最佳方法是調用它並處理將發生的異常。而且,我們可以設置一個「可靠性」的方法,在我的文章中描述。 – Erup 2010-05-19 17:34:30

+0

嗯,請記住,你永遠無法真正知道服務是否'起來'。你可以知道的是,如果你最近收到它的消息。所以,在這種情況下你真的可以發送定期的心跳消息。 – kyoryu 2010-05-22 06:09:39

+0

如果我們可以刪除嘗試catch'es,因爲異常是資源消耗,所以如果我們可以把一個簡單的如果沒有try catch,系統處於一個更好的狀態,比直接嘗試catch,這個服務是並且應用程序正在運行多線程進程,如果出現異常,將會出現過多的性能過熱... – deadManN 2017-10-11 06:11:11

2

如果你的服務是託管在IIS(或WAS),您可以執行內置到IIS6/7過程模型彈性。如果工人過程失敗,另一個將在其位置開始。怎麼運行的?使用Ping分析。其名爲AppoPool健康監測(描述here)。