IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Discussion :

Service Web WCF et gestion des erreurs


Sujet :

Services Web

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Par défaut Service Web WCF et gestion des erreurs
    Bonjour à tous !

    Je cherche à mettre en place une gestion des erreurs.
    Je m'explique :
    J'ai un service web WCF avec entity Framework qui traite les demandes d'un client.
    Toutes les méthodes de traitement contiennent des try/catch.
    Je souhaiterais que si une exception intervient, avoir la possibilité de remonter un message au client et éventuellement enregistrer les informations de l'erreur dans une table de log.

    En faisant mes recherches, j'ai vu ces liens concernant SOAP :
    http://msdn.microsoft.com/fr-fr/libr...v=vs.100).aspx
    http://msdn.microsoft.com/fr-fr/libr...v=vs.100).aspx

    Je me demandais s'il y avait d'autre façon de faire ou des exemples afin que j'y vois plus claire.

    Merci.

  2. #2
    Membre averti
    Inscrit en
    Août 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 18
    Par défaut
    et pourquoi ne pas utiliser l'option debug=true de la configuration WCF?
    De mémoire, cela remonte les exceptions au client (et donc les lignes qui ont déclenché).

    Cependant, je me souviens d'avoir lu que cela doit être évité sur la release de production...

  3. #3
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Ne jamais utiliser les infos brutes debug en prod! D'une part ce ne sont pas des infos que l'utilisateur va comprendre et/ou avoir besoin et d'autre part ça donne des infos sur la façon dont les services sont implémentés, et ça pourrait être utilisé par un hacker.

    Pour que ce soit fait dans les règles de l'art, il faut utiliser les FaultContract.

    Un exemple.

    L'interface du service :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     [ServiceContract]
        public interface ILeService
        {
            [OperationContract]
            [FaultContract(typeof(MyException))]
            void TestException();
        }

    l'implémentation :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     public class LeService : ILeService
        {
            public void TestException()
            {
                var e = new MyException {Message = "Hello world!"};
                throw new FaultException<MyException>(e);
            }
        }

    Mon exception custom :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
      [DataContract]
        public class MyException
        {
            private string _message;
     
            [DataMember]
            public string Message
            {
                get { return _message; }
                set { _message = value; }
            }
        }

    Et du côté client :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     var service = new LeServiceClient();
     
                try
                {
                    service.TestException();
                }
                catch (FaultException<MyException> fe)
                {
                    MessageBox.Show(fe.Detail.Message);
     
                }

    Tu peux aussi utiliser juste le FaultException sans créer ta propre exception, par exemple. Ça dépend de ce dont tu as besoin.

  4. #4
    Membre averti
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Par défaut
    Salut !

    phfdln => Merci pour cette réponse, mais je sais qu'il ne faut pas utiliser cette option en mode realese.

    GuruuMeditation => Je suis effectivement partie sur ce modèle.
    Cependant, bien que j'ai ajouté les attributs [DataContract] et [DataMember] sur ma classe MyException et ses propriétés, impossible de retrouvé ce type du coté client. Je ne vois pas d'où vient le problème.

    Merci pour ton aide.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Peut-on voir comment tu fais ? Normalement si tu as bien suivi l'exemple de GuruuMeditation alors le type devrait être dispo côté client.

  6. #6
    Membre averti
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Par défaut
    Voici ma classe custom exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
        [DataContract]
        public class NoDataExceptionModel : Exception
        {
            #region Constructors
            public NoDataExceptionModel()
            { }
     
            public NoDataExceptionModel(string message) :
                base(message)
            {
            }
     
            public NoDataExceptionModel(string message, Exception innerEx) :
                base(message, innerEx)
            {
            }
     
            public NoDataExceptionModel(string message, string methode, string objectType) :
                base(message)
            {
                _method = methode;
                _objectType = objectType;
            }
     
            public NoDataExceptionModel(string message, Exception innerEx, string methode, string objectType) :
                base(message, innerEx)
            {
                _method = methode;
                _objectType = objectType;
            }
            #endregion
     
            #region Private
            string _method;
            string _objectType;
            #endregion
     
            #region Accessors
            /// <summary>
            /// Method where the exception occured
            /// </summary>
            [DataMember]
            public string Method
            {
                get { return _method; }
                set { _method = value; }
            }
     
            /// <summary>
            /// Object type on which the exception occurs
            /// </summary>
            [DataMember]
            public string ObjectType
            {
                get { return _objectType; }
                set { _objectType = value; }
            }
            #endregion
        }
    L'interface du service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            [OperationContract]
            [FaultContract(typeof(NoDataExceptionModel))]
            Sheet GetSheetById(Guid id);
    L'implémentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            public Sheet GetSheetById(Guid sheetGuid)
            {
                eStore.Business.EStore es = new EStore();
                try
                {
                    return es.GetSheetByGuid(sheetGuid);
                }
                catch (NoDataExceptionModel ex)
                {
                    throw new FaultException<NoDataExceptionModel>(ex, ex.Message);
                }
            }
    Lorsque je génère ma solution, aucune erreur. Par contre lorsque je met à jour la référence de mon service Web, j'ai le message d'erreur suivant :

    Une erreur s'est produite lors du téléchargement de 'http://localhost/sStore.Service/EStoreService.svc'.
    La demande a échoué avec le message d'erreur :
    --
    <HTML><HEAD><STYLE type="text/css">#content{ FONT-SIZE:
    0.7em;PADDING-BOTTOM:2em;MARGIN-LEFT:
    30px}BODY{MARGIN-TOP:0px; MARGIN-LEFT:0px;
    Autant dire un message inexploitable !
    J'aurais tendance à dire que mon projet client n'arrive pas à dé-sérialiser le service web.
    Si j'enlève l'attribut [FaultContract(typeof(NoDataExceptionModel))] dans l'interface du service ou que je met l'attribut suivant [FaultContract(typeof(string))] je n'ai pas de message d'erreur.
    Pourtant, je ne vois pas ce qui peut causer problème dans ma classe NoDataExceptionModel.

    Si l'un d'entre vous à une idée, je suis preneuse !!

  7. #7
    Membre averti
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Par défaut
    Bon, j'ai compris pourquoi le client n'arrive pas à dé-sérialiser, j'ai fait hériter ma classe NoDataExceptionModel de Exception.

    Du coup, j'ai remplacer par la classe suivante :
    Custom exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
        [DataContract]
        public class NoDataFaultExceptionModel
        {
            #region Private
            private string _message;
            private string _objectType;
            #endregion
     
            #region Accessors
            [DataMember]
            public string Message
            {
                get { return _message; }
                set { _message = value; }
            }
     
            [DataMember]
            public string ObjectType
            {
                get { return _objectType; }
                set { _objectType = value; }
            }
            #endregion
        }
    Interface du service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            [OperationContract]
            [FaultContract(typeof(NoDataFaultExceptionModel))]
            Sheet GetSheetById(Guid sheetGuid);
    Implémentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
            public Sheet GetSheetById(Guid sheetGuid)
            {
                eStore.Business.EStore es = new EStore();
                try
                {
                    return es.GetSheetByGuid(sheetGuid);
                }
                catch (NoDataExceptionModel ex)
                {
                    var e = new NoDataFaultExceptionModel();
                    e.Message = ex.Message;
                    e.ObjectType = ex.ObjectType;
                    throw new FaultException<NoDataFaultExceptionModel>(e, e.Message);
                 }
            }
    Cette fois-ci, plus de problème lors de la mise à jour de la référence de mon service.
    Cependant, je ne trouve pas mon type NoDataFaultExceptionModel du côté client.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/11/2013, 07h34
  2. Couche service, gestion des erreurs
    Par dorian53 dans le forum Langage
    Réponses: 3
    Dernier message: 22/02/2013, 21h54
  3. Couche service, gestion des erreurs
    Par dorian53 dans le forum ALM
    Réponses: 0
    Dernier message: 19/02/2013, 23h49
  4. Gestion des erreurs WCF dans Silverlight 4
    Par EmacLi dans le forum Silverlight
    Réponses: 8
    Dernier message: 27/09/2012, 21h03
  5. [LG]gestion des erreurs
    Par frontin dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2003, 22h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo