Если что-то пойдет не так в вызове WCF REST, например, запрошенный ресурс не найден, как я могу поиграть с кодом ответа HTTP (например, установив для него что-то вроде HTTP 404) в моем методе OperationContract?
Если что-то пойдет не так в вызове WCF REST, например, запрошенный ресурс не найден, как я могу поиграть с кодом ответа HTTP (например, установив для него что-то вроде HTTP 404) в моем методе OperationContract?
Ответы:
Существует объект, к WebOperationContext
которому вы можете получить доступ, и у него есть OutgoingResponse
свойство типа, у OutgoingWebResponseContext
которого есть StatusCode
свойство, которое можно установить.
WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
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());
У меня это не сработало для служб данных WCF. Вместо этого вы можете использовать DataServiceException в случае Data Services. Нашел следующий пост полезным. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de