Как вернуть пользовательский код состояния 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());
Это не сработало для меня для служб данных 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";