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?

kgriffs
quelle
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?
Nathan Tregillus

Antworten:

111

Es gibt eine WebOperationContext, auf die Sie zugreifen können, und sie hat eine OutgoingResponseEigenschaft vom Typ, OutgoingWebResponseContextdie eine StatusCodeEigenschaft hat, die festgelegt werden kann.

WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
Eric Schoonover
quelle
5
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

Beispielsweise

throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );
Graeme Bradbury
quelle
4
Ich mag dies besser als das akzeptierte, da wir nicht den statischen WebOperationContext verwenden. Aktuell
Noel Abrahams
Beachten Sie, dass
sebagomez
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.

JarrettV
quelle
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:

catch (ArgumentException ex)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
    return null;
}
Hydtechie
quelle
1
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?
Shavais
2

Sie können auch einen Statuscode und Grund Körper mit Rück WebOperationContext ‚s Statuscode und StatusDescription :

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