Если что-то пойдет не так в вызове REST WCF, например, запрошенный ресурс не найден, как я могу играть с кодом ответа HTTP (например, с его настройкой на HTTP 404) в методе OperationContract?
Как я могу вернуть пользовательский код состояния HTTP из метода WCF REST?
Ответ 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;
}
Ответ 5
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
throw new WebException("令牌码不正确", new InvalidTokenException());
Ответ 6
Это не сработало для меня для служб данных WCF. Вместо этого вы можете использовать DataServiceException в случае Data Services. Нашел следующий пост полезным. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de