.Net WFC/service Web de gestion des exceptions modèle de conception

J'essaie de venir avec un simple, facile à utiliser modèle de conception pour la gestion des erreurs dans un .net service wcf (en particulier un silverlight permis de service wcf). Si une exception est lancée dans la méthode de service de l'application silverlight va voir un CommunicationException indiquant que "Le serveur distant a retourné une erreur: NotFound --->" et peut-être une trace de la pile en fonction de vos paramètres, ce qui est totalement pas utile parce qu'elle ne vous dit pas l'erreur réelle, et généralement la véritable erreur est de ne pas "NotFound".

À la lecture sur des services web et des services wcf et les exceptions, Vous devez jeter savon/wcf standard exceptions comme FaultException ou SoapException. Donc, pour un service wcf vous avez besoin d'envelopper chaque méthode dans un try catch, catch chaque exception, de l'envelopper dans un FaultException et de la jeter. Au moins, c'est ma compréhension, corrigez-moi si je me trompe.

J'ai donc créé mon modèle de conception:

[ServiceContract(Namespace = "http://MyTest")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DataAccess
{
    ///<summary>
    ///Error class, handle converting an exception into a FaultException
    ///</summary>
    [DataContractAttribute]
    public class Error
    {
        private string strMessage_m;
        private string strStackTrace_m;

        public Error(Exception ex)
        {
            this.strMessage_m = ex.Message;
            this.strStackTrace_m = ex.StackTrace;
        }

        [DataMemberAttribute]
        public string Message
        {
            get { return this.strMessage_m; }
            set { this.strMessage_m = value; }
        }

        [DataMemberAttribute]
        public string StackTrace
        {
            get { return this.strStackTrace_m; }
            set { this.strStackTrace_m = value; }
        }

        //Convert an exception into a FaultException
        public static void Throw(Exception ex)
        {
            if (ex is FaultException)
            {
                throw ex;
            }
            else
            {
                throw new FaultException<Error>(new Error(ex));
            }
        }
    }

    [OperationContract]
    [FaultContract(typeof(Error))]
    public void TestException()
    {
        try
        {
            throw new Exception("test");
        }
        catch (Exception ex)
        {
            Error.Throw(ex);
        }
    }
}

Donc, pour faire une longue histoire courte, je ne suis toujours pas arriver le corriger l'erreur dans mon application silverlight. Je inspecter le AsyncCompletedEventArgs.Erreur de l'objet et il contient toujours un CommunicationException objet avec l'erreur générique. M'aider à venir avec une belle conception simple motif pour me permettre de facilement jeter l'exception correcte du service, et facilement l'attraper dans l'application.

OriginalL'auteur Jeremy | 2009-01-14