Как я могу вернуть собственный код состояния HTTP из метода REST WCF?
88
Если что-то пойдет не так в вызове WCF REST, например, запрошенный ресурс не найден, как я могу поиграть с кодом ответа HTTP (например, установив для него что-то вроде HTTP 404) в моем методе OperationContract?
Хорошо, все ответы на этот вопрос предполагают, что контроль вошел в реализацию вашей службы. что, если они передадут совершенно неверный URI? как вы предполагаете предоставить 404 для всех неожиданных обращений к вашей службе?
Работает ли это внутри WCF Data Services - Service Operations? Мне не повезло, кажется, что установленный мной StatusCode превзошел что-то еще. Итак, на все запросы HTTP POST я возвращаю 204, независимо от того, что я установил его на 201 и т. Д.
RyBolt
1
В моем случае не работает, статус перезаписывается. Однако бросок WebFaultException, похоже, работает.
хм, в .NET 4.5.1 это не устанавливает для меня код состояния, я все еще получаю 200. Я использую jsonp, он вызывает мой обратный вызов (в javascript) и передает мое сообщение и мой код состояния как целое число.
Шаваис
4
Кажется, это отлично подходит для чего-либо, кроме кодов 2XX, но вы бы бросили a, WebFaultExceptionчтобы вернуть HttpStatusCode.Created?
Crush
23
Для 404 существует встроенный метод в WebOperationContext.Current.OutgoingResponse, называемый SetStatusAsNotFound (строковое сообщение) , который установит код состояния на 404 и описание состояния одним вызовом.
Обратите внимание, что есть также SetStatusAsCreated (местоположение Uri) , который установит код состояния на 201 и заголовок местоположения с помощью одного вызова.
У меня это тоже не сработало, я все еще получаю 200. Я использую WebHttpBinding с crossDomainScriptAccessEnabled = "true" и поведение конечной точки webHttp со стилем тела по умолчанию обернутым и форматом исходящего ответа по умолчанию json .. но это не имеет значения, не так ли?
Ответы:
Существует объект, к
WebOperationContext
которому вы можете получить доступ, и у него естьOutgoingResponse
свойство типа, уOutgoingWebResponseContext
которого естьStatusCode
свойство, которое можно установить.источник
WebFaultException
, похоже, работает.Если вам нужно вернуть тело причины, посмотрите WebFaultException
Например
throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );
источник
WebFaultException
чтобы вернутьHttpStatusCode.Created
?Для 404 существует встроенный метод в WebOperationContext.Current.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; }
источник
Вы также можете вернуть StatusCode и причину тела с WebOperationContext «s StatusCode и StatusDescription :
WebOperationContext context = WebOperationContext.Current; context.OutgoingResponse.StatusCode = HttpStatusCode.OK; context.OutgoingResponse.StatusDescription = "Your Message";
источник
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized; throw new WebException("令牌码不正确", new InvalidTokenException());
ссылка: https://social.msdn.microsoft.com/Forums/en-US/f6671de3-34ce-4b70-9a77-39ecf5d1b9c3/weboperationcontext-http-statuses-and-exceptions?forum=wcf
источник
У меня это не сработало для служб данных WCF. Вместо этого вы можете использовать DataServiceException в случае Data Services. Нашел следующий пост полезным. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de
источник