2012-01-19 81 views
4

在我的Mvc Api控制器中,如果用戶無法通過身份驗證,則會拋出HttpException 401.但是,RestSharp客戶端似乎將其轉換爲Http 500狀態碼。如何將401驗證錯誤返回給RestSharp客戶端?

我希望能夠從我的Mvc控制器中拋出HttpExceptions,並讓RestSharp客戶端在其StatusCode屬性中保留原始錯誤。

此外,我注意到如果服務器沒有啓動,當RestSharp客戶端發出請求時,響應的狀態碼爲0,響應代碼爲Error。 RestSharp是否不會返回404 http錯誤代碼?

我真正需要的是關於RestSharp如何使用HttpCodes的一些文檔。

更新,其中的代碼在我的API控制器:

throw new HttpException((int)HttpStatusCode.Unauthorized, AuthenticationError); 

回答

4

我已經能夠自己調查此問題。表單身份驗證在Web應用程序上設置,這意味着當從控制器返回HttpUnauthorizedResult時,MVC會啓動並重定向到登錄頁面。這對客戶端的影響是假設沒有錯誤發生。

我通過使用aspnet.suppressformsredirect nuget包來解決此問題,並將抑制標誌添加到響應以進行身份​​驗證。

+1

Right @jaffa,這應該是MVC 4的公認答案。但是,我們不得不下載一些東西來返回401呢?荒謬。我這種蹩腳的解決方法是發送403 Forbidden。 (看我的答案)。 – Rap

11

您已經驗證您真正迴歸401到客戶端?有時ASP.NET MVC有一些奇怪的錯誤處理。

嘗試返回HttpUnauthorizedResultMSDN doc

+0

我已經更新我的職務與代碼示例。控制器服務json,那麼使用HttpUnauthorisedResult是否能夠正常工作?我在這裏做正確的事情嗎? – jaffa

+0

我的答案仍然適用。我發現ASP.NET MVC更有可能錯誤地處理你的'HttpException'(並返回一個501),而不是'RestSharp'將401轉換爲500 – jgauffin

+1

這似乎破壞了httpcodes。我永遠無法將正確的錯誤顯示給用戶。 Mvc應該將正確的401發送回客戶端,在這種情況下是RestSharp。這有什麼辦法嗎? – jaffa

0

跛腳,跛腳,跛腳,我們必須下載一個NuGet包返回401!我的解決方法是用一個解釋禁止403迴應:

throw new HttpException((int)HttpStatusCode.Forbidden, 
    "Please log in as user " + UserId + " and try again."); 

語義不正確的,但少工作,少日常維護,並降低風險。

2

以下是在MVC中返回401的兩種方法。

return new HttpUnauthorizedResult("Unauthorized"); 

return new HttpStatusCodeResult(401); 
相關問題