Wie kann ich einen benutzerdefinierten HTTP-Statuscode von einer WCF-REST-Methode zurückgeben?
88
Wenn bei einem WCF-REST-Aufruf ein Fehler auftritt, z. B. dass die angeforderte Ressource nicht gefunden wird, wie kann ich dann mit dem HTTP-Antwortcode (z. B. HTTP 404) in meiner OperationContract-Methode spielen?
OK, alle Antworten auf diese Frage setzen voraus, dass die Kontrolle es in Ihre Service-Implementierung geschafft hat. Was ist, wenn sie einen völlig ungültigen Uri passieren? Wie sollen Sie einen 404 für alle unerwarteten Treffer Ihres Dienstes bereitstellen?
Funktioniert dies in WCF Data Services - Service Operations? Ich hatte kein Glück, anscheinend wird der von mir eingestellte StatusCode von etwas anderem übertrumpft. Bei allen HTTP-POST-Anforderungen erhalte ich 204 zurück, unabhängig davon, ob ich 201 usw. festgelegt habe.
RyBolt
1
Funktioniert in meinem Fall nicht, der Status wird überschrieben. Einen zu werfen WebFaultExceptionscheint jedoch zu funktionieren.
Josh M.
73
Wenn Sie einen Grundkörper zurückgeben müssen, schauen Sie sich WebFaultException an
hmm, in .NET 4.5.1 wird hier nicht der Statuscode für mich festgelegt, ich erhalte immer noch eine 200. Ich verwende jsonp, rufe meinen Rückruf (in Javascript) auf und übergebe meine Nachricht und meinen Statuscode als ganze Zahl.
Shavais
4
Dies scheint für alles außerhalb der 2XX-Codes großartig zu sein, aber würden Sie einen werfen WebFaultException, um einen zurückzugeben HttpStatusCode.Created?
Crush
23
Für 404 gibt es eine integrierte Methode in der WebOperationContext.Current.OutgoingResponse mit dem Namen SetStatusAsNotFound (Zeichenfolgenmeldung) , die den Statuscode auf 404 und eine Statusbeschreibung mit einem Aufruf setzt.
Beachten Sie, dass es auch SetStatusAsCreated (Uri-Standort) gibt, der den Statuscode auf 201 und den Standortkopf mit einem Aufruf setzt.
Wird dies der in der akzeptierten Antwort angezeigten Methode vorgezogen?
Crush
2
Wenn Sie die Statusbeschreibung im Header sehen möchten, sollte die REST-Methode sicherstellen, dass im folgenden Abschnitt Catch () null zurückgegeben wird:
Dies hat auch bei mir nicht funktioniert, ich bekomme immer noch eine 200. Ich verwende WebHttpBinding mit crossDomainScriptAccessEnabled = "true" und einem Endpunktverhalten von webHttp mit einem Standardkörperstil von Wrapped und einem Standardformat für ausgehende Antworten von json. aber das sollte doch egal sein, oder?
Antworten:
Es gibt eine
WebOperationContext
, auf die Sie zugreifen können, und sie hat eineOutgoingResponse
Eigenschaft vom Typ,OutgoingWebResponseContext
die eineStatusCode
Eigenschaft hat, die festgelegt werden kann.quelle
WebFaultException
scheint jedoch zu funktionieren.Wenn Sie einen Grundkörper zurückgeben müssen, schauen Sie sich WebFaultException an
Beispielsweise
quelle
WebFaultException
, um einen zurückzugebenHttpStatusCode.Created
?Für 404 gibt es eine integrierte Methode in der WebOperationContext.Current.OutgoingResponse mit dem Namen SetStatusAsNotFound (Zeichenfolgenmeldung) , die den Statuscode auf 404 und eine Statusbeschreibung mit einem Aufruf setzt.
Beachten Sie, dass es auch SetStatusAsCreated (Uri-Standort) gibt, der den Statuscode auf 201 und den Standortkopf mit einem Aufruf setzt.
quelle
Wenn Sie die Statusbeschreibung im Header sehen möchten, sollte die REST-Methode sicherstellen, dass im folgenden Abschnitt Catch () null zurückgegeben wird:
quelle
Sie können auch einen Statuscode und Grund Körper mit Rück WebOperationContext ‚s Statuscode und StatusDescription :
quelle
Ref: https://social.msdn.microsoft.com/Forums/en-US/f6671de3-34ce-4b70-9a77-39ecf5d1b9c3/weboperationcontext-http-statuses-and-exceptions?forum=wcf
quelle
Dies hat bei WCF Data Services bei mir nicht funktioniert. Stattdessen können Sie bei Data Services die DataServiceException verwenden. Fand den folgenden Beitrag nützlich. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de
quelle