2008-09-26 15 views
75

Si quelque chose ne va pas dans un appel WCF REST, comme la ressource demandée n'est pas trouvée, comment puis-je jouer avec le code de réponse HTTP (par exemple HTTP 404) dans ma méthode OperationContract?Comment puis-je renvoyer un code d'état HTTP personnalisé à partir d'une méthode WCF REST?

+0

ok toutes les réponses à cette prendre le contrôle fait dans votre mise en œuvre de services. Et s'ils passent un uri totalement invalide? comment allez-vous fournir un 404 pour tous les hits inattendus à votre service? –

Répondre

96

Il y a une WebOperationContext que vous pouvez accéder et il a une propriété OutgoingResponse de type OutgoingWebResponseContext qui possède une propriété StatusCode qui peut être réglé.

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

Est-ce que cela fonctionne dans WCF Data Services - Service Operations? Je n'ai pas eu de chance, il semble que le StatusCode que j'ai mis en place soit modifié par quelque chose d'autre. Donc sur toutes les requêtes HTTP POST, je récupère 204 que je l'ai réglé à 201, etc. – RyBolt

+1

Ne fonctionne pas dans mon cas, le statut est écrasé. Lancer un 'WebFaultException', cependant, semble fonctionner. –

23

Pour 404 il y a un construit en méthode sur le WebOperationContext.Current.OutgoingResponse appelé SetStatusAsNotFound (message de chaîne) qui établira le code d'état à 404 et une description de l'état d'un appel. Notez qu'il existe également SetStatusAsCreated (emplacement Uri) qui définira le code d'état sur 201 et l'en-tête de localisation avec un appel.

+0

Est-ce préférable à la méthode affichée dans la réponse acceptée? – crush

58

Si vous avez besoin de retourner un corps de raison alors jeter un oeil à WebFaultException

Par exemple

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

J'aime cela mieux que le accepté puisque nous n'utilisons pas le WebOperationContext statique. Courant –

+0

Gardez à l'esprit que cela n'est valide que depuis le travail de famework 4 http://msdn.microsoft.com/en-us/library/dd989924.aspx – sebagomez

+0

hmm, dans .NET 4.5.1 ce n'est pas le code d'état pour moi, je reçois toujours un 200. J'utilise jsonp, il appelle mon callback (en javascript) et passe mon message et mon code d'état en tant que entier. – Shavais

2

Si vous souhaitez voir la description de l'état dans l'en-tête, la méthode REST doit se assurer de revenir null de la section Catch() comme ci-dessous:

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

Cela n'a pas fonctionné pour moi non plus, je reçois toujours un 200. J'utilise WebHttpBinding avec crossDomainScriptAccessEnabled = "true" et un comportement point final de webHttp avec un style de corps par défaut de format de réponse sortant et par défaut de json. mais cela ne devrait pas importer, devrait-il? – Shavais