Як я можу повернути власний код стану HTTP із методу WCF REST?


88

Якщо щось виходить не так у виклику WCF REST, наприклад, запитаний ресурс не знайдений, як я можу грати з кодом відповіді HTTP (наприклад, встановивши його на щось на зразок HTTP 404) у своєму методі OperationContract?


добре, всі відповіді на це припустити, що контроль увійшов у вашу реалізацію послуги. а що, якщо вони передадуть якісь абсолютно недійсні урі? як ви передбачаєте надати 404 для всіх несподіваних звернень до вашої служби?
Nathan Tregillus

Відповіді:


111

Існує , WebOperationContextщо ви можете отримати доступ і вона має OutgoingResponseвластивість типу , OutgoingWebResponseContextякий має StatusCodeвластивість , яке може бути встановлено.

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

5
Чи працює це всередині WCF Data Services - Service Operations? Мені не пощастило, здається, StatusCode, який я встановив, перетворюється на щось інше. Отже, на всі запити HTTP POST я отримую 204, незалежно від того, що я встановив це значення 201, і т.д.
RyBolt

1
У моєму випадку це не працює, статус перезаписується. Викидання WebFaultException, однак, здається, працює.
Джош М.

73

Якщо вам потрібно повернути тіло причини, перегляньте WebFaultException

Наприклад

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

4
Мені це подобається більше, ніж прийнятому, оскільки ми не використовуємо статичний WebOperationContext.Current
Noel Abrahams

майте на увазі, це дійсно лише з famework 4 msdn.microsoft.com/en-us/library/dd989924.aspx
sebagomez

хм, в .NET 4.5.1 це не встановлює код стану для мене, я все ще отримую 200. Я використовую jsonp, він викликає мій зворотний виклик (у javascript) і передає моє повідомлення та код стану як ціле число.
Shavais

4
Це здається чудовим для будь-чого, що не є кодами 2XX, але ви б кинули, WebFaultExceptionщоб повернути HttpStatusCode.Created?
розчавити

23

Для 404 існує вбудований метод на WebOperationContext.Current.OutgoingResponse з назвою SetStatusAsNotFound (рядок повідомлення), який встановить код стану 404 та опис стану одним викликом.

Зверніть увагу, що існує також SetStatusAsCreated (розташування Uri), який встановить код стану 201 і заголовок розташування одним викликом.


Це переважно над способом, відображеним у прийнятій відповіді?
розчавити

2

Якщо ви хочете побачити опис стану в заголовку, метод REST повинен переконатися, що повертає null із розділу Catch (), як показано нижче:

catch (ArgumentException ex)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
    return null;
}

1
Це теж не спрацювало для мене, я все одно отримую 200. Я використовую WebHttpBinding з crossDomainScriptAccessEnabled = "true" і поведінкою кінцевої точки webHttp із типом оберненого тіла за замовчуванням та вихідним форматом відповідей json .. але це не повинно мати значення, чи не так?
Shavais

2

Ви також можете повернути StatusCode і причину тіла з WebOperationContext «s StatusCode і StatusDescription :

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


0

У мене це не спрацювало для WCF Data Services. Натомість ви можете використовувати DataServiceException у випадку Служб даних. Наступний пост знайшов корисним. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de


Це теж не працює для мене, я просто отримую 400 поганих запитів, без іншої корисної інформації та без відповіді.
Shavais
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.