web-dev-qa-db-fra.com

Quelle est la meilleure façon de retourner des erreurs d'un service de WCF de manière reposante?

L'utilisation de la WCF de manière reposante semble super. Je suis un grand fan des gros canons comme la simplicité et la flexibilité, mais j'aime aussi la façon dont les URL finissent par regarder. Que puis-je dire, je suis un programmeur.

L'API simple pour récupérer et éditer des ressources est assortie d'un ensemble presque simple de réponses d'erreur possibles et je ne peux pas m'empêcher de penser à une approche reposante "pure", je me coupe peut-être me couper le nez sur le visage, Ou plus précisément, le nez de mes consommateurs de services Web. Je pourrais avoir tort, mais il ne semble pas y avoir de très nombreux codes d'erreur HTTP que je peux utiliser et qu'aucune façaie de transmettre un message d'erreur personnalisé.

Pour clarifier, je parle d'erreurs exceptionnelles appropriées et à des erreurs non attendues. Je veux réellement communiquer un problème à l'utilisateur pour les aider à identifier ce qu'ils doivent faire pour le corriger.

Options possibles que je considère ...

  1. tilisez simplement les codes d'erreur HTTP - Cela semble être trop restrictif dans ce que je suis capable d'exprimer et ne me permettrai pas de fournir un message personnalisé. S'il vous plait corrigez moi si je me trompe.

  2. retournez toujours le succès http mais renvoie des objets d'erreur personnalisés - évidemment le plus flexible mais certainement pas le plus reposant.

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


Mettre à jour

Merci pour la suggestion d'utiliser la propriété StatusDescription de l'objet OutgoingWebResponseContext. Il semblait d'abord être quelque chose que je pourrais 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.

J'ai des problèmes pour le faire travailler, cependant. Indépendamment de la valeur que je fournis à 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 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: Mer, 07 Jan 2009 14:01:20 GMT
X-aspnet-version: 2.0.50727
Cache-Control: Privé
Longueur de contenu: 0
Connexion: fermer

Ce n'est pas comme si je devais juste avoir besoin d'accéder à la propriété appropriée sur le client. Les informations ne sont tout simplement pas envoyées sur le lien.

Qu'est-ce que cette propriété StatusDescription fait réellement?


Mettre à jour

Je n'ai jamais découvert comment définir la propriété StatusDescription. J'ai fini par ne pas y compris un message d'erreur du tout et je vais uniquement avec les codes d'état HTTP. J'ai choisi d'exposer à la fois des critères de savon et des points d'extrémité reposants pour mes services, et les clients peuvent donc choisir qu'ils préfèrent utiliser - les messages simples simples ou les messages de savon relativement riches.

36
Andy McCluggage

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

9
Hank Gay

Avec .NET 4, lancez A WebFaultException<T>(T errorDetail,HttpResponseCodecode)

Ici, vous définissez votre type de réponse à un autre type d'objet, ce qui a du sens, et vous définissez également le ResponseCode que vous voulez.

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

21
Guillermo Ruffino

Voir ce fil pour une question similaire.

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

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

Je ne sais pas grand chose de la prévalence de cette technique dans le monde réel malheureusement.

2
Crescent Fresh
0
Craig Boland