2012-01-16 2 views
0

WCF 웹 API 코드에서 "찾을 수 없음"에 대한 올바른 HTTP 오류 코드를 반환하는 데 문제가 있습니다. 여기에 나는 또한 로깅 핸들러가WCF webapi에서 HTTP 대신 HTTP 500 받기

[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; 
    } 

내 API 방법 ... ...

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." 

... 내 로깅 처리기가 응답 상태 코드를 선택하여 응답 상태 코드를 500으로 변경합니다.

따라서 fe w 블로그 게시물 및 답변을 so, this로 변경했습니다.

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

...하지만 지금은 200입니다. 분명히 잘못되었습니다.

그래서 올바른 방법은 무엇입니까? 그것은 마치 HttpResponseException 던지기가 작동하지 않고 코드가 실행 된 것처럼 보입니다.

답변

2

하여 오류 처리기의 코드는 항상 명시 적으로 500 그것은 500를 반환 무엇 당신이하려고하는 같은 소리

항상 상태를 설정하는대로 상관없이 500 응답 메시지를 변경하지 않습니다 응용 프로그램 오류 일 경우에만 해당됩니다. 이 경우 오류 예외가 HttpResponseException인지 확인하고 무시하는 대신 오류를 확인해야합니다.

WebOperationContext는 기본적으로 아무 작업도하지 않으므로 Web API를 사용하지 마십시오.

희망이 글렌

+0

감사를하는 데 도움이됩니다. 나는 단지 같은 결론에 도달했다. 난 그냥 HttpResponseExceptions 무시해야합니다 :). WebOperationContext의 사용에 관해서는 올바른 결과를 얻으려면 조작 핸들러에서 사용해야한다는 것을 알았습니다. 그게 합리적이라고 생각하니? 그렇지 않다면 그 주제에 대해 다른 질문을 게시 할 것입니다. –

+0

op 처리기에서 무엇을 사용하고 있습니까? –