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?
Répondre
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;
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
Ne fonctionne pas dans mon cas, le statut est écrasé. Lancer un 'WebFaultException', cependant, semble fonctionner. –
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.
Est-ce préférable à la méthode affichée dans la réponse acceptée? – crush
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);
J'aime cela mieux que le accepté puisque nous n'utilisons pas le WebOperationContext statique. Courant –
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
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
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;
}
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
Cela n'a pas fonctionné pour moi pour WCF Data Services. Au lieu de cela, vous pouvez utiliser DataServiceException dans le cas de Data Services. Trouvé le message suivant utile. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de
Cela ne marche pas non plus pour moi, je reçois juste une 400 Bad Request, sans autre information utile, et aucun corps de réponse. – Shavais
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
throw new WebException("令牌码不正确", new InvalidTokenException());
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? –