it-swarm.com.ru

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

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

84
kgriffs

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

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

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

Например 

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

Для 404 есть встроенный метод в WebOperationContext.Current.OutgoingResponse said SetStatusAsNotFound (string message) , который установит код состояния на 404 и описание статуса с одним вызовом. 

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

23
JarrettV

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

catch (ArgumentException ex)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
    return null;
}
2
Hydtechie
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

1
user5234326

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

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

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

0
OnlyMahesh