Как я могу вернуть пользовательский код состояния HTTP из метода WCF REST?

Если что-то пойдет не так в вызове REST WCF, например, запрошенный ресурс не найден, как я могу играть с кодом ответа HTTP (например, с его настройкой на HTTP 404) в методе OperationContract?

Ответ 1

Существует WebOperationContext, к которому вы можете получить доступ, и имеет OutgoingResponse свойство типа OutgoingWebResponseContext, которое имеет StatusCode, который можно установить.

WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;

Ответ 2

Если вам нужно вернуть тело причины, посмотрите WebFaultException

Например

throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );

Ответ 3

Для 404 существует встроенный метод в WebOperationContext.Current.OutgoingResponse, называемый SetStatusAsNotFound (строковое сообщение), который установит код состояния 404 и описание состояния с одним вызовом.

Обратите внимание, что есть также SetStatusAsCreated (местоположение Uri), который установит код состояния 201 и заголовок местоположения одним вызовом.

Ответ 4

Если вы хотите увидеть описание состояния в заголовке, метод REST должен обязательно вернуть null из раздела Catch(), как показано ниже:

catch (ArgumentException ex)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
    return null;
}