2008-09-26 21 views
75

Jeśli coś pójdzie nie tak w wywołaniu WCF REST, takie jak żądany zasób nie zostanie znaleziony, w jaki sposób można grać z kodu odpowiedzi HTTP (ustawienie go na coś jak HTTP 404, na przykład) w moim metoda OperationContract?Jak mogę zwrócić niestandardowy kod stanu HTTP z metody WCEST REST?

+0

ok wszystkie odpowiedzi do tego kontrolę przejmie się go do realizacji usług. co jeśli przejdą jakieś całkowicie nieważne uri? jak się domyślacie podać 404 dla wszystkich nieoczekiwanych trafień w waszym serwisie? –

Odpowiedz

96

Jest WebOperationContext że można uzyskać dostęp i ma OutgoingResponse właściwość typu OutgoingWebResponseContext który ma StatusCode właściwość, że może być ustawiony.

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

Czy to działa w ramach usług danych WCF - operacji serwisowych? Nie miałem szczęścia, wygląda na to, że ustawiony przeze mnie StatusCode zostaje skradziony przez coś innego. Tak więc we wszystkich żądaniach HTTP POST wracam 204 niezależnie od tego, czy ustawiłem je na 201, itd. – RyBolt

+1

Nie działa w moim przypadku, status zostanie nadpisany. Wyrzucanie 'WebFaultException' jednak wydaje się działać. –

23

Na 404 jest wbudowany w metodzie na WebOperationContext.Current.OutgoingResponse zwanego SetStatusAsNotFound (komunikat string) że ustawi kod stanu do 404 oraz opis stanu z jednego połączenia.

Uwaga istnieje również, SetStatusAsCreated (lokalizacja Uri), która ustawi kod stanu na 201 i nagłówek lokalizacji z jednym wywołaniem.

+0

Czy jest to preferowane w porównaniu z metodą wyświetlaną w zaakceptowanej odpowiedzi? – crush

58

Jeśli trzeba zwrócić ciało powód następnie przyjrzeć się WebFaultException

Na przykład

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

Lubię to lepiej niż przyjętym jednego ponieważ nie używasz statycznego WebOperationContext.Current –

+0

pamiętać ten jest ważny tylko od famework 4 http://msdn.microsoft.com/en-us/library/dd989924.aspx – sebagomez

+0

hmm, w .NET 4.5.1 nie jest to ustawienie kodu statusu dla mnie, ja wciąż dostaję 200. Używam jsonp, że dzwoni mój zwrotnego (w JavaScript) i przekazując moją wiadomość i mój kod stanu jako liczba całkowita. – Shavais

2

Jeśli chcesz zapoznać się z opisem stanu w nagłówku, metoda REST powinien upewnić się, aby powrócić 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

To nie działa na mnie też, ja wciąż dostać 200. Używam WebHttpBinding z crossDomainScriptAccessEnabled = „true” oraz zachowań punkt końcowy webHttp z domyślnym stylem ciała zawinięte i wychodzącej domyślnego formatu reakcji json. Ale to nie powinno mieć znaczenia, prawda? – Shavais