2011-06-18 61 views
1

我有一個WCF服務配置爲通過系統的重寫的Validate()方法使用自定義用戶名驗證。 IdentityModel.SelectorsUserNamePasswordValidator班。如何處理WCF自定義驗證的異常?

當驗證失敗時,我拋出一個SecurityTokenValidationException

它的構建方式,在我的客戶端,我收到一條消息:CommuinicationException:遠程服務器返回一個錯誤:NotFound。

在客戶端處理這個異常的最好方法是什麼?

我的驗證代碼:

if (user == null || (Environment.TickCount - user.LastCall) > 300000) 
{ 
    if (!LoginUser.ValidateUser(userName, password)) 
    { 
     throw new SecurityTokenValidationException("Usuário/Senha inválido"); 
    } 
} 

回答

2

從服務拋出異常將(I相信)故障的信道,並在客戶端將收到的非描述性消息。這是設計 - WCF在服務端「隱藏」了例外。

要將錯誤返回給客戶端,以便客戶端可以處理它,您應該使用FaultException。您可以爲操作指定一個FaultContract,並將其返回給客戶端。

在WCF中進行錯誤處理的搜索,你應該得到大量的例子。我時間不夠或者我會補充一些,但希望這會讓你指出正確的方向。

編輯,以

更改線路

throw new SecurityTokenValidationException("Usuário/Senha inválido"); 

添加到

throw new FaultException("Usuário/Senha inválido"); 

投擲的FaultException將防止故障的通信 - 那麼客戶端可以收到異常,知道這是由於驗證失敗,並決定從那一點開始做什麼(重試,提示用戶重新輸入cr edentials等)。

這是一個非常簡單的改變,這個例子就是爲了說明這一點。我在下面發佈的鏈接將提供更詳細的信息。

+0

這裏有幾個鏈接來看看: http://stackoverflow.com/questions/2379917/wcf-exception-handling-strategies http://stackoverflow.com/questions/3979010/wcf-exception-handling HTTP://blogs.msdn。 COM/b/pedram /存檔/ 2008/01/25/WCF的錯誤處理,和一些條最佳practices.aspx http://www.extremeexperts.com/Net/Articles/ExceptionHandlingInWCF.aspx – Tim

+0

謝謝,蒂姆!它現在運作良好。 –

0

你如何確定你檢查上次調用的用戶對象?你正在使用LINQ Single調用嗎?如果是這樣,如果找不到用戶,這將拋出一個異常,所以服務器將在當時中止認證,而不是與SecurityTokenValidationException,我認爲這會給你看到的行爲