2012-01-19 20 views
4

私のMvc Apiコントローラで、ユーザーが認証できない場合は、HttpException 401を投げます。しかしRestSharpクライアントはこれをHttp 500ステータスコードに変換しているようです。RestSharpクライアントに401認証エラーを返すにはどうすればよいですか?

私の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パッケージを使用してこれを解決し、認証用の応答にsuppressフラグを追加しました。

+1

Right @ jaffa、これはMVC 4の受け入れられた答えになるはずです。でも、401を返すために何かをダウンロードしなければならないのはどうですか?ばかばかしい。私のちょっとした回避策は、403 Forbiddenを送信することです。 (私の答えを見てください)。 – Rap

11

は、あなたが本当にクライアントに401を返すことを確認したことがありますか? ASP.NET MVCには時々、奇妙なエラー処理があります。

代わりにHttpUnauthorizedResultを返すようにしてください。 MSDN doc

+0

私は、コード例と私のポストを更新しました。コントローラーはjsonに対応しているので、HttpUnauthorisedResultを正しく使用することはできますか?私はここに正しいことをしていますか? – jaffa

+0

私の答えはまだ適用されます。 ASP.NET MVCが 'HttpException'を正しく処理しない(そして501を返す)可能性が高いことがわかります。' RestSharp'は401を500に変換します。 – jgauffin

+1

これはHTTPコードを破るようです。私は今まで正しいエラーをユーザーに表示することはできません。 Mvcは正しい401をクライアントに返します。この場合RestSharpです。これには何らかの方法がありますか? – jaffa

0

私は401を返すためにNuGetパッケージをダウンロードしなければならないラメ、ラメ、ラメです!

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

意味的に正しくないが、あまり仕事、あまり継続的な保守、および低リスクである:私の問題を回避するには、説明と禁断の403で応答することです。

2

ここでは、MVCで401を返す2つの方法があります。

return new HttpUnauthorizedResult("Unauthorized"); 

または

return new HttpStatusCodeResult(401); 
関連する問題