2012-01-16 16 views
0

WCF Web APIコードで「見つからない」という正しいHTTPエラーコードを返すのに問題があります。ここに私のAPIメソッドは、何が起こっているWCF webapiでHTTP 404の代わりにHTTP 500を取得

protected override bool OnTryProvideResponse(Exception exception, ref HttpResponseMessage message) 
    { 
     if (exception != null) 
     { 
      var msg = "Request failed."; 
      _logger.Error(exception, msg); 
     } 

     message = new HttpResponseMessage 
         { 
          StatusCode = HttpStatusCode.InternalServerError 
         }; 

     return true; 
    } 

は私が...

HttpResponseException 

"The response message returned by the Response property of this exception should be immediately returned to the client. No further handling of the request message is required." 
を次の例外を取得していますが...私もログハンドラを持っている...

[WebInvoke(Method = "GET", UriTemplate = "{id}")] 
    [RequireAuthorisation] 
    public Customer GetCustomer(int id) 
    { 
     var customer = Repository.Find(id); 
     if (customer == null) 
     { 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     } 
     return customer; 
    } 

です

...私のロギングハンドラが応答ステータスコードを取得して500に変更します。

したがって、fe SOのブログの投稿と回答wが、私はこれに変更...

 if (customer == null) 
     { 
      WebOperationContext.Current.OutgoingResponse.SetStatusAsNotFound(); 
      return null; 
     } 

...しかし、これは今、私に明らかに間違っている200を与えます。

だから、これを行う正しい方法は何ですか?あたかもHttpResponseExceptionの投げ込みがうまくいかず、コードが実行されたようです。

答えて

2

あなたのエラーハンドラ用のコードスニペットは、常に明示的に500それは500を返している何をやろうとしているように聞こえる

に常にステータスを設定しているとどのような関係なく500に応答メッセージを変更することはありませんアプリケーションエラーの場合にのみオンにします。そのような場合は、エラー例外がHttpResponseExceptionであるかどうかをチェックして、オーバーライドするのではなく戻ります。

WebOperationContextに関しては、基本的には何もしていないため、Web APIを使用しないでください。

希望これは グレン

+0

おかげで役立ちます。私はちょうど同じ結論に至りました。私はちょうどHttpResponseExceptionsを無視する必要があります:)。 WebOperationContextの使用に関しては、正しい結果を得るために操作ハンドラでそれを使用しなければならないことがわかりました。それは合理的に聞こえるか?そうでなければ、私はその主題について別の質問を掲示します。 –

+0

オペレーションハンドラで何を使用していますか? –

関連する問題