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

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

7 ответов


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

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

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

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

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

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


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

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

WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
throw new WebException("令牌码不正确", new InvalidTokenException());

ref:https://social.msdn.microsoft.com/Forums/en-US/f6671de3-34ce-4b70-9a77-39ecf5d1b9c3/weboperationcontext-http-statuses-and-exceptions?forum=wcf


Это не сработало для меня для служб данных WCF. Вместо этого можно использовать DataServiceException в случае служб данных. Нашел следующий пост полезным. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de


вы также можете вернуть тело statuscode и reason с помощью WebOperationContext ' s StatusCode и StatusDescription:

WebOperationContext context = WebOperationContext.Current;
context.OutgoingResponse.StatusCode = HttpStatusCode.OK;
context.OutgoingResponse.StatusDescription = "Your Message";