27 votes

Quelle est la meilleure façon de renvoyer des erreurs à partir d'un service WCF de manière RESTful?

À l'aide de la WCF dans une bonne voie semble grand. Je suis un grand fan de la grosse artillerie comme la simplicité et la flexibilité, mais j'aime aussi la façon dont l'Url a l'air. Ce que je peux dire, je suis un programmeur.

L'API simple pour la récupération et modification des ressources est compensée par une presque aussi simple ensemble de réponses d'erreur possibles, et je peux pas m'empêcher de penser que, pour en rester à une "pure" approche RESTful j'ai peut-être la coupe de mon nez hors de dépit en face, ou plus précisément, le nez de mon web service consommateurs. J'ai peut-être tort, mais il ne semble pas être très nombreux codes d'erreur Http que je peux utiliser, et aucun moyen de passer de nouveau un message d'erreur personnalisé.

Pour préciser, je parle de la bonne exceptionnel erreurs et ne devrait pas les erreurs. Je veux communiquer un problème à l'utilisateur pour les aider à identifier ce qu'ils doivent faire pour la corriger.

Les options possibles, je suis en considérant...

  1. Suffit d'utiliser les codes d'erreur Http – Ce sembler comme il serait trop restrictif de ce que je suis en mesure d'exprimer, et ne me permet pas de fournir un message personnalisé. S'il vous plaît(!) corrigez-moi si je me trompe.

  2. Toujours retour Http Succès, mais le retour d'erreur personnalisés objets – de toute Évidence, la plus flexible, mais certainement pas le plus Reposant.

Je serais vraiment reconnaissant si quelqu'un pouvait partager certains de l'expérience réelle de ce problème particulier.


Mise à jour

Merci pour la suggestion de l'aide de l' StatusDescription de la propriété de l' OutgoingWebResponseContext objet. Il semblait à première vue être quelque chose que je pourrais utiliser.

Je suis venu à la conclusion que mon deuxième option ci-dessus n'est pas pour moi. Je veux coller à la ce Http peut me donner.

J'ai du mal à la faire fonctionner, cependant. Quelle que soit la valeur que je l'approvisionnement pour cette propriété, il n'est pas retourné dans la réponse.

Ma méthode de service ressemble à ceci

public MyType GetMyTypes(string criteria)
{
    try
    {
        return GetMyTypes();
    }
    catch (Exception ex)
    {
        OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
        response.StatusCode = HttpStatusCode.Forbidden;
        response.StatusDescription = "A Big fat error occurred";
        return null;
    }
}

Et voici les premières message de réponse. Il n'y a aucune mention du message personnalisé...

HTTP/1.1 403 Forbidden
Serveur: ASP.NET Serveur de Développement/9.0.0.0
Date: Wed, 07 Jan 2009 14:01:20 GMT
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Length: 0
Connection: Close

C'est pas comme si j'ai juste besoin d'accéder à la propriété correcte sur le client. L'information n'est tout simplement pas envoyé à travers le lien.

Qu'est-ce StatusDescription bien faire réellement?


Mise à jour

Je n'ai jamais trouvé comment configurer le StatusDescription de la propriété. J'ai pas de message d'erreur, et d'aller uniquement avec les codes d'état Http. J'ai choisi de présenter à la fois le Savon de repos et de points de terminaison pour mes services, et afin que les clients peuvent choisir qui ils préfèrent utiliser – le simple Reposant messages ou le plus riche des messages Soap.

16voto

GLM Points 868

Avec .net 4, lancez un WebFaultException<T>(T errorDetail, HttpResponseCode code)

Ici, vous définissez votre type de réponse sur un autre type d'objet, ce qui est logique, et vous définissez également le ResponseCode que vous souhaitez.

Le errorDetail doit être sérialisable

http://blogs.msdn.com/b/endpoint/archive/2010/01/21/error-handling-in-wcf-webhttp-services-with-webfaultexception.aspx

7voto

Hank Gay Points 36173

Envoyez le code de réponse approprié et vous pouvez fournir le message d'erreur personnalisé dans le corps de la réponse.

2voto

Crescent Fresh Points 54070

Voir ce fil pour une question similaire.

En un mot, je crois que vous pouvez définir le code d'état HTTP (pour l'un des codes d'erreur), et de fournir votre message personnalisé dans la StatusDescription propriété:

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = System.Net.HttpStatusCode.Forbidden;
response.StatusDescription = "Custom";

Je ne sais pas beaucoup au sujet de la prévalence de cette technique dans le monde réel malheureusement.

0voto

Craig Boland Points 337

Cela peut être un défaut. Depuis le 22/09/2011, le problème est en cours d'examen par l'équipe produit:

http://connect.microsoft.com/VisualStudio/feedback/details/690162/wcf-rest-custom-outgoingwebresponsecontext-statusdescription-not-returned-in-response

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X