2012-04-18 62 views
0

我有一個WCF服務客戶端對。我們一直依靠在客戶端的工廠方法上調用Open()來確保服務在我們撥打電話之前可用。喜歡的東西:在禁用安全性後,WCF客戶端的Open()方法不再引發異常。該怎麼辦?

MyClient GetClient() 
{ 
    MyClient client = new MyClient(); 
    try 
    { 
     client.Open(); 
     return client; 
    } 
    catch(Exception) 
    { 
     //perform an (important) error-handling here 
    } 
} 

通過這種方式,調用者代碼將只是這樣做:

client = factory.GetClient(); 
client.CallMethodInTheService(); 

,他們並不需要擔心錯誤處理。

這適用於我們將安全模式設置爲Windows並將clientCredentialType設置爲wshttpbinding中的Windows。 client.Open()會在服務不可用時拋出異常,所以錯誤處理代碼將被執行。但是,現在我們正在部署一個不能使用基於Windows憑據的安全性的環境,因此我們將安全模式設置爲無。但是,這會導致client.Open()在服務不可用時不再引發異常,並且由於我們在工廠的catch塊中依賴此代碼,所以存在一些問題。

當我們使用消息安全性時,Open()拋出異常但是當我們禁用安全性時拋出異常的原因是什麼? 如果安全性設置爲none,我們如何執行類似的可用性檢查?我不認爲這是一個很好的解決方案,在每個單獨的調用中進行錯誤處理。在返回客戶端對象之前,工廠方法是否有另一種方法檢查服務的可用性?

+1

你的頭像讓我想downvote你。幸運的是,我抵制了誘惑。 – 2012-04-18 17:36:27

+0

爲什麼?我希望它會誘惑人們upvote :) – 2012-04-18 17:37:58

回答

1

只有在涉及到會話的情況下,該異常纔會被拋出。例如establishSecurityContext = true或negotiateServiceCredentials = true(defautls)。在第一次調用服務器之前的那些情況下,客戶端會發送一些infra消息給它,以便決定使用一個cryptogtaphic密鑰。當你調用open()時,你明確地要求現在進行這個協商(否則它會在第一次調用時發生)。如果你打開Wcf日誌(或者Fiddler),你會看到這個。

當服務不可用時,協商將失敗,因此您會收到異常。

沒有安全性,沒有會話,所以沒有例外。

我建議你爲服務添加一個IsAlive操作。

+0

很酷。感謝您的解釋和建議的解決方案!它似乎工作,我希望有解決方案,但不更新代碼。 – 2012-04-19 04:24:37

相關問題