[英]WCF client's Open() method no longer throw exceptions after security is disabled. What to do?
我有一個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();
而且他們不必擔心錯誤處理。
當我們在wshttpbinding中將安全模式設置為Windows並將clientCredentialType設置為Windows時,此方法有效。 當服務不可用時,client.Open()將引發異常,因此將執行錯誤處理代碼。 但是,現在我們在無法使用基於Windows憑據的安全性的環境中進行部署,因此我們將安全性模式設置為none。 但是,這導致當服務不可用時,client.Open()不再引發異常,並且由於我們依賴於工廠的catch塊中的此代碼,因此出現了一些問題。
當我們使用消息安全性而不是禁用安全性時,Open()引發異常的原因是什么? 如果安全性設置為無,我們如何執行類似的可用性檢查? 我認為在每個單獨的調用上嘗試進行錯誤處理不是一個很好的解決方案。 返回客戶端對象之前,工廠方法還有另一種方法來檢查服務的可用性嗎?
僅在涉及會話的情況下,不會以任何安全性引發異常。 例如,EstablishmentSecurityContext = true或negotiationServiceCredentials = true(默認值)。 在那些情況下,在第一次調用服務器之前,客戶端將向其發送一些基礎消息,以便確定要使用的密碼密鑰。 當您調用open()時,您明確要求立即進行此協商(否則它將在第一次調用中進行)。 如果打開Wcf日志記錄(或Fiddler),則會看到此信息。
當該服務無法使用時,協商將失敗,因此您將獲得例外。
沒有安全性就沒有會話,因此也不例外。
我建議您將IsAlive操作添加到該服務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.