Come posso restituire un codice di stato HTTP personalizzato da un metodo REST WCF?


88

Se qualcosa va storto in una chiamata REST WCF, ad esempio la risorsa richiesta non viene trovata, come posso giocare con il codice di risposta HTTP (impostandolo su qualcosa come HTTP 404, ad esempio) nel mio metodo OperationContract?


ok tutte le risposte a questa ipotesi di controllo sono state inserite nell'implementazione del servizio. e se passassero degli uri totalmente non validi? come pensi di fornire un 404 per tutti i colpi inaspettati al tuo servizio?
Nathan Tregillus

Risposte:


111

C'è una a WebOperationContextcui puoi accedere e ha una OutgoingResponseproprietà di tipo OutgoingWebResponseContextche ha una StatusCodeproprietà che può essere impostata.

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

5
Funziona all'interno di WCF Data Services - Service Operations? Non ho avuto fortuna, sembra che lo StatusCode che ho impostato venga superato da qualcos'altro. Quindi su tutte le richieste HTTP POST, ottengo indietro 204 indipendentemente da averlo impostato su 201, ecc.
RyBolt

1
Non funziona nel mio caso, lo stato viene sovrascritto. Lanciare un WebFaultException, tuttavia, sembra funzionare.
Josh M.

73

Se devi restituire un corpo del motivo, dai un'occhiata a WebFaultException

Per esempio

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

4
Mi piace di più rispetto a quello accettato poiché non stiamo usando il WebOperationContext.Current statico
Noel Abrahams

tenere a mente questo è valido solo a partire dal 4 famework msdn.microsoft.com/en-us/library/dd989924.aspx
sebagomez

hmm, in .NET 4.5.1 questo non sta impostando il codice di stato per me, sto ancora ottenendo un 200. Sto usando jsonp, sta chiamando il mio callback (in javascript) e passando il mio messaggio e il mio codice di stato come un numero intero.
Shavais

4
Sembra fantastico per qualsiasi cosa al di fuori dei codici 2XX, ma lanci un WebFaultExceptionper restituire un HttpStatusCode.Created?
schiacciare il

23

Per 404 esiste un metodo incorporato in WebOperationContext.Current.OutgoingResponse chiamato SetStatusAsNotFound (messaggio di stringa) che imposterà il codice di stato su 404 e una descrizione dello stato con una chiamata.

Nota che c'è anche SetStatusAsCreated (Uri location) che imposterà il codice di stato su 201 e l'intestazione della posizione con una chiamata.


È preferibile rispetto al metodo visualizzato nella risposta accettata?
schiacciare il

2

Se desideri vedere la descrizione dello stato nell'intestazione, il metodo REST dovrebbe assicurarsi di restituire null dalla sezione Catch () come di seguito:

catch (ArgumentException ex)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
    return null;
}

1
Anche questo non ha funzionato per me, ottengo ancora un 200. Sto usando WebHttpBinding con crossDomainScriptAccessEnabled = "true" e un comportamento del punto finale di webHttp con uno stile di corpo predefinito di wrapping e un formato di risposta in uscita predefinito di json .. ma non dovrebbe importare, vero?
Shavais

2

È inoltre possibile restituire un corpo statuscode e la ragione con WebOperationContext s' StatusCode e StatusDescription :

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.