Come posso restituire un codice di stato HTTP personalizzato da un metodo REST WCF?
Domanda
Se qualcosa non funziona in una chiamata REST WCF, come 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?
Soluzione
Esiste un WebOperationContext
a cui puoi accedere e ha un OutgoingResponse
proprietà di tipo OutgoingWebResponseContext
che ha un StatusCode
proprietà che può essere impostata.
WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
Altri suggerimenti
Se devi restituire un corpo della motivazione, dai un'occhiata a WebFaultException
Ad esempio
throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );
Per 404 esiste un metodo integrato in WebOperationContext.Current.OutgoingResponse chiamato SetStatusAsNotFound (messaggio stringa) che imposterà il codice di stato su 404 e una descrizione dello stato con una chiamata.
Nota che c'è anche, SetStatusAsCreated (posizione Uri) che imposterà il codice di stato su 201 e l'intestazione della posizione con una chiamata.
Se si desidera visualizzare 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;
}
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
throw new WebException("令牌码不正确", new InvalidTokenException());
Puoi anche restituire uno statuscode e un body reason con WebOperationContext ' StatusCode e StatusDescription :
WebOperationContext context = WebOperationContext.Current;
context.OutgoingResponse.StatusCode = HttpStatusCode.OK;
context.OutgoingResponse.StatusDescription = "Your Message";
Questo non ha funzionato per me per WCF Data Services. Invece, è possibile utilizzare DataServiceException in caso di Data Services. Ho trovato utile il seguente post. http://social.msdn.microsoft .com / Forum / it / adodotnetdataservices / thread / f0cbab98-fcd7-4248-af81-5f74b019d8de