Jak mogę zwrócić niestandardowy kod stanu HTTP z metody WCF REST?


88

Jeśli coś pójdzie nie tak w wywołaniu REST WCF, na przykład nie można znaleźć żądanego zasobu, jak mogę grać z kodem odpowiedzi HTTP (na przykład ustawiając go na coś takiego jak HTTP 404) w mojej metodzie OperationContract?


ok, wszystkie odpowiedzi na to zakładanie kontroli znalazły się w Twojej implementacji usługi. co jeśli przejdą jakieś całkowicie nieważne URI? jak masz zapewnić 404 dla wszystkich nieoczekiwanych trafień w twojej usłudze?
Nathan Tregillus

Odpowiedzi:


111

Jest to, do WebOperationContextktórego masz dostęp i ma OutgoingResponsewłaściwość typu, OutgoingWebResponseContextktóra ma StatusCodewłaściwość, którą można ustawić.

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

5
Czy to działa w ramach usług danych WCF - operacje usług? Nie miałem szczęścia, wygląda na to, że StatusCode, który ustawiłem, został zastąpiony czymś innym. Tak więc we wszystkich żądaniach HTTP POST otrzymuję 204, niezależnie od tego, czy ustawię 201 itd.
RyBolt

1
W moim przypadku nie działa, status zostaje nadpisany. WebFaultExceptionJednak rzucanie wydaje się działać.
Josh M.

73

Jeśli chcesz zwrócić treść przyczyny, spójrz na WebFaultException

Na przykład

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

4
Podoba mi się to bardziej niż akceptowane, ponieważ nie używamy statycznego WebOperationContext.Current
Noel Abrahams,

pamiętaj, że jest to ważne tylko od czasu famework 4 msdn.microsoft.com/en-us/library/dd989924.aspx
sebagomez

hmm, w .NET 4.5.1 to nie jest ustawienie dla mnie kodu stanu, nadal otrzymuję 200. Używam jsonp, wywołuje moje wywołanie zwrotne (w javascript) i przekazuje moją wiadomość i kod stanu jako liczba całkowita.
Shavais

4
Wydaje się to świetne w przypadku czegokolwiek poza kodami 2XX, ale czy rzuciłbyś, WebFaultExceptionaby zwrócić HttpStatusCode.Created?
zmiażdż

23

W przypadku 404 istnieje wbudowana metoda w WebOperationContext.Current.OutgoingResponse o nazwie SetStatusAsNotFound (komunikat tekstowy) , która ustawi kod stanu na 404 i opis stanu za pomocą jednego wywołania.

Zauważ, że istnieje również SetStatusAsCreated (lokalizacja Uri) , która ustawi kod stanu na 201 i nagłówek lokalizacji za pomocą jednego wywołania.


Czy jest to preferowane w stosunku do metody wyświetlanej w zaakceptowanej odpowiedzi?
zmiażdż

2

Jeśli chcesz zobaczyć opis statusu w nagłówku, metoda REST powinna zwrócić wartość null z sekcji Catch (), jak poniżej:

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

1
U mnie to też nie zadziałało, nadal otrzymuję wartość 200. Używam WebHttpBinding z crossDomainScriptAccessEnabled = "true" i zachowania punktu końcowego webHttp z domyślnym stylem treści zawiniętym i domyślnym formatem odpowiedzi wychodzącej json .. ale to nie powinno mieć znaczenia, prawda?
Shavais

2

Można również zwrócić StatusCode i rozumu organizmowi WebOperationContext „s StatusCode i StatusDescription :

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.