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 :

Exception renvoyer par le Web Service


Sujet :

Services Web

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 18
    Par défaut Exception renvoyer par le Web Service
    Bonjour,

    J'ai un souci avec la gestion des exceptions et j'ai pas trouvé de tutoriel en parlant.
    J'ai mon web service qui fonctionne sans problème, j'ai générer ma référence au service (Ajouter une référence de service ...) afin de consommer mon web service.

    Tout fonctionne bien quand les données sont bonnes, mais mon web service est charger de faire certaines vérification tel que le nom d'utilisateur qui doit contenir au moins 5 caractères.
    Si ce n'est pas le cas: voici l'erreur retourné par mon web service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
       <S:Body>
          <S:Fault xmlns:ns3="http://www.w3.org/2003/05/soap-envelope">
             <faultcode>S:Server</faultcode>
             <faultstring>Le nom d'utilisateur doit contenir au moins 5 caractères.</faultstring>
        </S:Fault>
       </S:Body>
    </S:Envelope>
    Le problème c'est que lorsqu'une exception est levé, j'obtiens une exception du type FormatException qui ne me permet pas de retrouver l'erreur spécifié par mon web service.

    Comment faut-il faire pour récupérer les exceptions du web service ?

    Merci d'avance

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 351
    Par défaut
    Salut Mric,

    Dans la méthode que tu utilise dans ton Service Web, as-tu déjà mis un try... catch dans ton code? Est-ce que tu peux exécuter ton Service Web en mode debug?

    Cédric

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 18
    Par défaut
    Oui j'ai bien mis un bloc try catch, mais la seule exception qui est levé est FormatException, j'ai essayer avec un FaultException mais ça ne marche pas.

    J'ai ceci au niveau de la déclaration de ma méthode d'authentification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
            [System.ServiceModel.FaultContractAttribute(typeof(ClientGrIDsure.GrIDsure.fault), Action="", Name="fault")]
            [System.ServiceModel.XmlSerializerFormatAttribute()]
            ClientGrIDsure.GrIDsure.authenticationResponse authentication(ClientGrIDsure.GrIDsure.authentication request);
    Je vois pas trop de ce que ca veut dire :s

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 351
    Par défaut
    Salut Mric_,

    si j'ai bient compris, ta as Service Web, par exemple: web2, qui appelle une méthode du Service Web web1 comme toto(...)?

    Tu dis que tu aa ajouter une référence dans Web2 sur Web1 afin de pouvoir utiliser la méthode toto(...) par exemple:

    As-tu essayer de faire qqch comme ça dans Service Web web1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [WebMethod]
    public string toto( string authentification)
    {
    .....
    return "ok";
    }
    Si en appelant cette methode construite de cette façon cela passe, cela voudrait que tu as ton problème viendrait du type de données que tu as défini!
    Est-ce que cela répond à ce que tu veux???

    Cédric

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 18
    Par défaut
    Citation Envoyé par Cédric B. Voir le message
    Salut Mric_,

    si j'ai bient compris, ta as Service Web, par exemple: web2, qui appelle une méthode du Service Web web1 comme toto(...)?
    c'est exactement ca

    En fait j'ai (et c'est peut être pas la meilleure solution en fait) généré automatiquement l'accès à mon webService (Ajouter une référence de service -> adresse du web service et il fait tout).

    Ca me donne ca :
    la Web methode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public authenticationResponseType authentication(authenticationType authentication1) {
                authentication inValue = new authentication();
                inValue.authentication1 = authentication1;
                authenticationResponse retVal = ((GridsureService)(this)).authentication(inValue);
                return retVal.authenticationResponse1;
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
            ClientGrIDsure.GrIDsure.authenticationResponse ClientGrIDsure.GrIDsure.GridsureService.authentication(ClientGrIDsure.GrIDsure.authentication request) {
                return base.Channel.authentication(request);
            }
    ou le base est un System.ServiceModel.ClientBase qui permet d'initialiser une classe grâce à des informations de configuration qui sont je sais pas ou :s

    classe authenticationType (qui en gros contient uder, token, pass) :
    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
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.1434")]
        [System.SerializableAttribute()]
        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.ComponentModel.DesignerCategoryAttribute("code")]
        [System.Xml.Serialization.XmlTypeAttribute(Namespace="ws.gridsure.research.ca.fr/v01")]
        public partial class authenticationType : object, System.ComponentModel.INotifyPropertyChanged {
     
            private string userIdField;
     
            private string tokenField;
     
            private string passCodeField;
            [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
            public string userId {
                get {
                    return this.userIdField;
                }
                set {
                    this.userIdField = value;
                    this.RaisePropertyChanged("userId");
                }
            }
            [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
            public string token {
                get {
                    return this.tokenField;
                }
                set {
                    this.tokenField = value;
                    this.RaisePropertyChanged("token");
                }
            }
            [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2)]
            public string passCode {
                get {
                    return this.passCodeField;
                }
                set {
                    this.passCodeField = value;
                    this.RaisePropertyChanged("passCode");
                }
            }
     
            public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
     
            protected void RaisePropertyChanged(string propertyName) {
                System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
                if ((propertyChanged != null)) {
                    propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
                }
            }
        }
    classe authenticationResponseType (qui en gros contient un sessionId) :
    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
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.1434")]
        [System.SerializableAttribute()]
        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.ComponentModel.DesignerCategoryAttribute("code")]
        [System.Xml.Serialization.XmlTypeAttribute(Namespace="ws.gridsure.research.ca.fr/v01")]
    public partial class authenticationResponseType : object, System.ComponentModel.INotifyPropertyChanged {
     
            private string sessionIdField;
            [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
            public string sessionId {
                get {
                    return this.sessionIdField;
                }
                set {
                    this.sessionIdField = value;
                    this.RaisePropertyChanged("sessionId");
                }
            }
     
            public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
     
            protected void RaisePropertyChanged(string propertyName) {
                System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
                if ((propertyChanged != null)) {
                    propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
                }
            }
        }
    classe authentication :
    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
    [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
        [System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
        public partial class authentication {
     
            [System.ServiceModel.MessageBodyMemberAttribute(Name="authentication", Namespace="ws.gridsure.research.ca.fr/v01", Order=0)]
            public ClientGrIDsure.GrIDsure.authenticationType authentication1;
     
            public authentication() {
            }
     
            public authentication(authenticationType authentication1) {
                this.authentication1 = authentication1;
            }
        }
    Je sais pas si ca va t'aider :s !!!
    Sinon tu pense que je peux refaire les appels aux web service moi même avec la possibilité d'envoyer et de récupérer plusieurs paramêtres tout en gérant les exceptions ?

    PS : dsl mais je viens de commencer en .net et c'est moins facile qu'en JAVA :p

    Merci de ton aide

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 351
    Par défaut
    Salut Mric_,

    Ah je comprends, tu as créé ta classe c# à partir d'un fichier *.wsdl avec wsdl.exe.
    Si je comprends bien, lorsque tu déclares une varaible de type "authentificationType" à quel moment affectues-tu des attributs "userIdField" et "passCodeFild"???

    Cédric

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 18
    Par défaut
    Oui c'est bien généré automatique! Au début je me suis dit "génial", mais je crois que je vais devoir tout recréer moi même. En effet j'ai le WSDL qui existe et qui est fonctionnel (testé en java et qui fonctionne même avec les exceptions).

    Ah oui j'ai pas mis l'appel de ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try {
                authenticationType auth = new authenticationType();
                auth.userId = user;
                auth.token = token1;
                auth.passCode = pass;
                authenticationResponseType response = service.authentication(auth);
                sessionId = response.sessionId;
                userAuthentifie = user;
    } catch (FormatException exception) {
                Console.Write(exception.StackTrace);
    }
    Avec user, token1 et pass récupéré depuis ma form.
    Avec un appel correct, tout fonctionne bien.
    Avec une erreur, l'exception est levé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Server stack trace: 
       à System.ServiceModel.Dispatcher.FaultFormatter.Deserialize(MessageFault messageFault, String action)
       à System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
       à System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
       à System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
       à System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
       à System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 351
    Par défaut
    Salut Mric_,

    Si tu donnes un user, un toaken et un pass correct, cela fonctionne!! alors quei si une des trois variables n'est pas remplies ou mal saisie cela te déclenche l'exception. Est-ce correct?

    Si oui, dans ce cas, il faut modifier ou refaire la méthdoe "authentication()" afin de mieux le cas des mauvaise saisie.

    D'autre part, afin d'éviter de déclencher ton exception pourquoi tu ne testes pas le résultat de la variable "response":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    authenticationResponseType response = service.authentication(auth);
     
    if (response == null)
    {
    ......
    }
                sessionId = response.sessionId;
    Ou est-ce que ton exception se produit lors de l'appel de la méthdoe "authentication()".

    Cédric

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 18
    Par défaut
    Tu as tout compris

    Je suis uniquement consommateur du web service, je ne dois pas effectué de traitement.

    Dans mon cas, l'exception est levé, comme tu dis, lors de l'appel de la méthode "authentication()" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    authenticationResponseType response = service.authentication(auth);
    Ce qui fait que mon sessionId reste null donc le test marcherai.
    Seulement il ne me permet pas de savoir pourquoi l'authentification n'a pas marché (pseudo inexistant, token qui n'est plus valide, etc ...).

    Retour du service web pour le pseudo inexistant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
       <S:Body>
          <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
             <faultcode>S:Server</faultcode>
             <faultstring>Authentification échouée : l'utilisateur n'existe pas.</faultstring>
          </S:Fault>
       </S:Body>
    </S:Envelope>
    Retour du service web pour le mot de passe faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
       <S:Body>
          <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
             <faultcode>S:Server</faultcode>
             <faultstring>Authentification échouée : mot de passe erroné.</faultstring>
          </S:Fault>
       </S:Body>
    </S:Envelope>
    Enfin après j'ai une multitude de message car mon service contient plusieurs méthodes, mais comprendre une seule me suffirait pour modifier le reste.

    Dans l'erreur , il fait référence à un MessageFault, peut être que c'est un moyen d'arriver a récupérer le message, mais je ne voit pas comment y accéder.

    Merci de prendre du temps pour moi

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 351
    Par défaut
    Salut Mric_,

    L'élément MessageField, est-ce que c'est un attribut la variable "response" de type "authenticationResponseType" ou est-ce que tu la trouve uniquement lorsque l'exception est déclenchée dans "try...catch".

    Si c'est un attribut tu peux tester comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ....
    if (response.MessageField != "")
    {
    afficher les message 
    }
    ....
    Car je suppose qui si tu rentre un userId, un token et un pass, l'élément derait vide!
    Enfin voilà, clest le seul moyen pour traiter ton erreur. Regarde si tu aurais d'autres éléments permettant de mieux identifier l'erreur (par exemple. numéro d'erreur ou autre).

    J'espère que cela répond à tes attendts.

    J'ai aussi eu ce genre, mais qui était un peu plus complexe où j'ai aussi dû créer une classe à partir d'un fichier wsdl et attaquer depuis le c# une interface créée avec les outis d'IBM.

    Cédric

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 18
    Par défaut
    Non c'est uniquement lorsque l'exception est levé.
    Mon objet responseType n'est pas instancié lorsque j'ai une exception, il reste à null car la fonction retourne rien.

    Je pense que je vais essayé de créer moi même l'appel a mon webService de façon à prendre en compte les SoapException, MessageFault etc etc ...

    En fait Visual Studio ne fait que le travail de base et ne permet pas d'effectuer des appels à des web services complexe (que ce soit avec les exceptions ou avec la sécurité) lorsque l'on passe par l'outil de génération automatique.

    Merci quand même.

Discussions similaires

  1. Réponses: 12
    Dernier message: 14/01/2011, 10h10
  2. Réponses: 0
    Dernier message: 02/06/2010, 23h57
  3. Réponses: 1
    Dernier message: 08/07/2009, 14h00
  4. Réponses: 8
    Dernier message: 08/07/2008, 14h11
  5. Réponses: 5
    Dernier message: 22/05/2008, 14h55

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