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?
Odpowiedz
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;
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
Nie działa w moim przypadku, status zostanie nadpisany. Wyrzucanie 'WebFaultException' jednak wydaje się działać. –
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.
Czy jest to preferowane w porównaniu z metodą wyświetlaną w zaakceptowanej odpowiedzi? – crush
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);
Lubię to lepiej niż przyjętym jednego ponieważ nie używasz statycznego WebOperationContext.Current –
pamiętać ten jest ważny tylko od famework 4 http://msdn.microsoft.com/en-us/library/dd989924.aspx – sebagomez
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
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;
}
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
To nie działało dla mnie w przypadku usług danych WCF. Zamiast tego można użyć DataServiceException w przypadku usług danych. Znaleziono następujący wpis użyteczny. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de
To nie działa na mnie też, po prostu dostać 400 Bad Request, bez innych przydatnych informacji, a nie ciało odpowiedzi. – Shavais
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
throw new WebException("令牌码不正确", new InvalidTokenException());
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? –