2012-01-19 84 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); 
相关问题