2012-09-04 20 views
5

私のアプリケーションから適切なHTTPコードと応答を返そうとしていますが、苦労しています。特定のHTTP応答を返す2つの方法があるようです。空の200応答を返すWebAPIアクションメソッドでHttpResponseExceptionをスローする

私はそれに対処したい方法がHttpResponseExceptionを投げることである:

public Information Get(int apiKey) 
{ 
    if (!_users.Authenticate(apiKey)) 
    { 
     var response = new HttpResponseMessage(); 
     response.StatusCode = (HttpStatusCode)401; 
     response.ReasonPhrase = "ApiKey invalid"; 

     throw new HttpResponseException(response); 
    } 

    return _info.Get(); 
} 

しかし、私が見る私はこれを行う応答は、単に空200応答であります!

また、あなたはまた、このようなHttpResponseMessageを返すために、あなたのアクションメソッドのシグネチャを変更することができるようだ:

public HttpResponseMessage Get() 
{ 
    if (!_users.Authenticate(apiKey)) 
    { 
     return Request.CreateResponse((HttpStatusCode) 401, "ApiKey invalid"); 
    } 

    return Request.CreateResponse((HttpStatusCode) 200, _info.Get()); 
} 

私はそれを助けることができる場合、私は本当に私は多くのだろう、これを行うにはしたくありませんむしろ返すタイプは、毎回HttpResponseMessageでラップするのではなく、取り出すことを試みているオブジェクトです。

最初の方法が、メッセージが表示されている401の代わりに、空の200を返す理由がありますか?

答えて

5

2つの可能な解決策。

最初にです。 Make sure your IIS is configured to let errors pass through

<configuration> 
    <system.webServer> 
    <httpErrors existingResponse="PassThrough" /> 
    </system.webServer> 
</configuration> 

セカンド。私は完全にはわかりませんが、ASP.NET Web API may require you to develop a custom ActionFilter to properly translate Exceptions to result typesです。これは私が個人的にウェブAPIでのエラー処理を行う方法です:あなたは

  • は、カスタムのActionFilterを書く他の.NETアプリケーションで行うのと同じように、

    1. は、Web APIでスローされる例外のいずれかのタイプを許可すること例外をキャッチし、それらを適切な形式に変換します。たとえば、すべての例外をカスタムJSON形式でシリアル化します。クライアント側では、この形式に基づいてエラー(検証例外など)を処理できるカスタムAJAXトリッキーがあります。
  • +0

    私は最後に例外を処理するフィルターを使用して終了しました。そのmsdnの記事に向かって私を指してくれました – jcvandan

    1

    HttpConfigurationにIncludeErrorDetailPolicy設定を確認してください。デフォルトでは、Web APIにローカルでアクセスしながらエラーの詳細を表示するというポリシーが適用されます。

    +0

    私はそれを見ていただきありがとうございます – jcvandan

    関連する問題