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?
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ć.
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.
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?
Odpowiedzi:
Jest to, do
WebOperationContext
którego masz dostęp i maOutgoingResponse
właściwość typu,OutgoingWebResponseContext
która maStatusCode
właściwość, którą można ustawić.źródło
WebFaultException
Jednak rzucanie wydaje się działać.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 );
źródło
WebFaultException
aby zwrócićHttpStatusCode.Created
?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.
źródło
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; }
źródło
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";
źródło
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
źródło
To nie zadziałało w przypadku usług danych WCF. Zamiast tego możesz użyć DataServiceException w przypadku usług danych. Znalazłem przydatny następujący post. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de
źródło