2012-01-16 3 views
0

У меня возникли проблемы с возвратом правильного кода ошибки HTTP для «не найденного» в моем коде API WCF. Вот мой метод апи ...Получение HTTP 500 вместо HTTP 404 с WCF webapi

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

У меня также есть обработчик протоколирования ...

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 ж сообщений в блоге и ответов на SO, я изменил это ...

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

... но теперь дают мне 200. Что это явно не так.

Итак, каков правильный способ сделать это? Кажется, что металирование HttpResponseException не работает, а код после выполнения.

ответ

2

фрагмент кода для обработчика ошибок не всегда изменяет ответное сообщение 500 независимо от того, как вы явно устанавливая статус всегда 500.

Похоже, что вы пытаетесь сделать, это вернуть 500 ТОЛЬКО, если это ошибка приложения. Если это так, вы должны проверить, является ли исключение ошибки исключением HttpResponseException и просто возвращает, а не переопределяет.

Что касается WebOperationContext, не используйте его вообще с Web Api, поскольку он в основном не работает.

Надеется, что это помогает Гленн

+0

спасибо. Я просто пришел к такому же выводу. Мне просто нужно игнорировать HttpResponseExceptions :). Что касается использования WebOperationContext, я обнаружил, что должен использовать это в обработчике операции, чтобы получить правильный результат. Это звучит разумно? Если нет, я отправлю еще один вопрос по этому вопросу. –

+0

Что вы используете для работы в op-обработчике? –

Смежные вопросы