Question

Utiliser WCF de manière RESTful semble génial. Je & # 8217; suis un grand fan des gros canons comme la simplicité et la flexibilité, mais j'aime aussi la façon dont les Urls finissent par paraître. Que puis-je dire, je & # 8217; je suis un programmeur.

L’API simple permettant de récupérer et d’éditer des ressources est assortie d’un ensemble presque aussi simple de réponses d’erreur possibles, et je ne peux & # 8217; ne pas vous aider à garder le & # 8220; pur # 8221; Approche RESTful Je suis peut-être en train de me couper le nez face au visage, ou plus précisément au nez de mes clients de services Web. Je peux me tromper, mais il ne & # 8217; semble pas y avoir beaucoup de codes d’erreur HTTP que je peux utiliser et aucun moyen de renvoyer un message d’erreur personnalisé.

Pour clarifier, je parle d’erreurs exceptionnelles appropriées et d’erreurs non attendues. Je souhaite réellement communiquer un problème à l'utilisateur pour l'aider à identifier ce qu'il doit faire pour le corriger.

Options possibles que j'envisage ...

  1. Utilisez simplement les codes d'erreur HTTP & # 8211; Cela semble être trop restrictif dans ce que je suis capable d’exprimer, et & # 8217; t ne me permettra pas de fournir un message personnalisé. S'il vous plaît (!) Corrigez-moi si je me trompe.

  2. Renvoyez toujours le succès Http mais renvoyez les objets d'erreur personnalisés & # 8211; Évidemment le plus flexible mais certainement pas le plus reposant.

J'apprécierais vraiment que quiconque puisse partager une expérience réelle de ce problème particulier.

Mettre à jour

Merci de votre suggestion d'utiliser la propriété StatusDescription de l'objet OutgoingWebResponseContext. Au début, cela semblait être quelque chose que je pouvais utiliser.

Je suis arrivé à la conclusion que ma deuxième option ci-dessus n'est pas pour moi. Je veux m'en tenir à ce que Http peut me donner.

Toutefois, j’ai du mal à le faire fonctionner. Quelle que soit la valeur fournie pour cette propriété, elle ne & # 8217; ne sera pas renvoyée 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 le message de réponse brut. Il n'y a aucune mention du message personnalisé ...

  

HTTP / 1.1 403 Interdit
  Serveur: Serveur de développement ASP.NET / 9.0.0.0
  Date: mercredi 07 janvier 2009 14:01:20 GMT
  X-AspNet-Version: 2.0.50727
  Cache-Control: privé
  Content-Length: 0
  Connexion: Fermer

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

Qu'est-ce que cette <=> propriété fait réellement?

Mettre à jour

Je n'ai jamais trouvé comment définir la propriété StatusDescription. J'ai fini par ne pas inclure de message d'erreur du tout et aller uniquement avec les codes d'état Http. J'ai choisi d'exposer les points de terminaison Soap et Restful pour mes services, afin que les clients puissent choisir ceux qu'ils préfèrent utiliser & # 8211; les messages simples Restful ou les messages Soap relativement plus riches.

Était-ce utile?

La solution

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

Autres conseils

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

Vous définissez ici le type de réponse sur un autre type d'objet, ce qui est logique, ainsi que le ResponseCode souhaité.

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

J'ajoute le code d'erreur comme ci-dessus (dans la description de l'état) et dans le corps de la page renvoyée dans mes services REST comme suit:

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Unauthorized;
response.StatusDescription = "You are not authorized.";
HttpContext.Current.Response.Write("You are not authorized.");
return null;

Voir ce fil pour une question similaire.

En résumé, je pense que vous pouvez définir le code de statut HTTP (sur l'un des codes d'erreur) et fournir votre message personnalisé dans propriété StatusDescription :

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

Malheureusement, je ne sais pas grand chose de la prévalence de cette technique dans le monde réel.

Ceci 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top