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