2011-11-02 2 views
1

J'ai trouvé un tas de questions qui étaient très proches de ce dont j'avais besoin. Mais je suis inquiet d'avoir manqué des informations importantes.WCF Rest .NET 4.0 Exceptions non gérées

Comment puis-je intercepter toutes les exceptions non gérées à l'aide de WCF Rest avec .NET 4.0?

Pour des raisons de sécurité, je ne souhaite pas que des exceptions non gérées soient transmises au client. Je veux enregistrer toutes les exceptions et pour les exceptions inconnues il suffit de renvoyer 500 Erreur interne du serveur. Ma meilleure recherche jusqu'à présent me dit que je dois implémenter IErrorHandler et lancer WebFaultExceptions pour les exceptions connues. Un problème que j'ai avec cela est que toute ma logique métier est dans un projet distinct du service WCF et il est illogique de lancer une exception Web de la bibliothèque de classes sous-jacente car la bibliothèque de classes pourrait être consommée par un autre processus ne peut pas être un service de repos WCF. Y a-t-il une bonne façon de cartographier les exceptions?

Répondre

1

Oui, vous pouvez implémenter IErrorHandler et l'utiliser pour mapper des exceptions. Vous n'avez pas besoin de lancer WebFaultException à partir de votre logique métier, il suffit de lancer vos exceptions personnalisées.

Par exemple, vous pouvez mapper YourCustomException à une chaîne json simple. Au lieu de la chaîne, vous pouvez mettre un objet. Exemple IErrorHandler.ProvideFault mise en œuvre:

public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
{   
     if (error is YourCustomException) 
     { 
      fault = Message.CreateMessage(version, string.Empty, String.Format("Error: {0}.", error.Message), new DataContractJsonSerializer(typeof(string))); 
      fault.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Json)); 

      webOperationContextWrapper.SetOutgoingResponseStatusCode(HttpStatusCode.InternalServerError); 
     } 
} 

Alors, quand YourCustomException est jeté par la logique métier, il sera attrapée par le gestionnaire et converti en défaut approprié. Voir aussi: CodeProject article

Questions connexes