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 :

WEB SERVICE AXIS --> Page asp net 2 C# Problème avec les types complexes


Sujet :

Services Web

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 9
    Points
    9
    Par défaut WEB SERVICE AXIS --> Page asp net 2 C# Problème avec les types complexes
    Bonjour à tous,
    Je doit consommer, dans une page asp .net en c#, un webservice java (AXIS) qui propose plusieurs méthodes demandant en paramètre et retournant en réponse, des objets complexes, issue du wsdl de ce webservice.

    J'utilise visual studio 2005, j'ai donc intégrer ce webservice à mon projet en tant que web reference. Je retrouve dans la classe générée les objets et les méthodes proposées par ce webservice.

    Une des méthodes ne demande pas de paramètre et retourne un entier, j'arrive à recevoir une réponse correcte, donc les échanges fonctionnent.

    En revanche les autres méthodes qui demandent et retournent des paramètres de type complexe, ne fonctionnent pas.

    En fait, il n'y a pas d'erreur de générée, mais l'objet retourné à la valueur null.

    Voici le lien du webservice utilisé, la méthode sur laquelle je fais mes essais est getPegasusVersionInfo() :
    http://cattest.tecdoc.net/pegasus-1-...ocToCatWL?wsdl

    Merci pour votre aide.

  2. #2
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    T'arrive à retrouver un résultat avec un client java ?

    J'ai regardé la méthode Web elle prend en parametre un VersionInfoRequest et retourne un VersionInfoResponse.

    Peut-être que si VersionInfoRequest est mal initialisé alors la méthode retourne null.

    Dispose-tu d'une doc pour consommer le Service Web ?
    Mehdi Feki : Modérateur .Net

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    le code appelant la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TecdocToCatSkeletonService t = new TecdocToCatSkeletonService();  
    VersionInfoRequest p = new VersionInfoRequest();
    p.provider = -1;
    VersionInfoResponse resp = t.getPegasusVersionInfo(p);
    Voici mes objets :

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    //Objet en entrée
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute
    (Namespace="http://datatype.cat.tecdoc.net" )]
    public partial class VersionInfoRequest : VersionInfoRequestSrc
    {        
    private int providerField;        
    /// <remarks/>    
    public int provider 
    {        
    get {            
    return this.providerField;        
    }        
    set {            
    this.providerField = value;        
    }    
    }
    }  
    //Objet en sortie[System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://datatype.cat.tecdoc.net" )]
    public partial class VersionInfoResponse 
    {        
    private int buildField;        
    private string dateField;        
    private int majorField;        
    private int minorField;        
    private int revisionField;        
    private int statusField;        
    private string statusTextField;        
    /// <remarks/>    
    public int build 
    {        
    get 
    {            
    return this.buildField;        
    }        
    set 
    {            
    this.buildField = value;        
    }    
    }        
    /// <remarks/>    
    [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]    
    public string date 
    {        
    get 
    {            
    return this.dateField;        
    }        
    set 
    {            
    this.dateField = value;        
    }    
    }        
    /// <remarks/>    
    public int major 
    {        
    get {            
    return this.majorField;        
    }        
    set {            
    this.majorField = value;        
    }   
    }        
    /// <remarks/>    
    public int minor 
    {        
    get 
    {            
    return this.minorField;        
    }        
    set 
    {            
    this.minorField = value;        
    }    
    }        
    /// <remarks/>    
    public int revision {        
    get {            
    return this.revisionField;        
    }        
    set {            
    this.revisionField = value;        
    }    
    }        
    /// <remarks/>    
    public int status 
    {        
    get 
    {            
    return this.statusField;        
    }        
    set 
    {            
    this.statusField = value;        
    }    
    }        
    /// <remarks/>    
    [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]    
    public string statusText 
    {        
    get 
    {            
    return this.statusTextField;        
    }        
    set 
    {            
    this.statusTextField = value;        
    }    
    }
    } 
     
    //Methode appellée    
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestNamespace="urn:axis.server.cat.tecdoc.net", ResponseNamespace="urn:axis.server.cat.tecdoc.net", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]    
    [return: System.Xml.Serialization.XmlElementAttribute("getPegasusVersionInfoReturn",Form = System.Xml.Schema.XmlSchemaForm.Unqualified,IsNullable=true, Type=typeof( VersionInfoResponse) )]    
    public VersionInfoResponse getPegasusVersionInfo(VersionInfoRequest in0)    
    {        
    try        
    {            object[] results = this.Invoke("getPegasusVersionInfo", new object[] { in0 });      
     
    return (VersionInfoResponse)results[0];        
    }        
    catch (Exception e)        
    {            throw new Exception();        
    }    
    }
    J'ai besoin de wsdl.exe car en intégrant le webservice et tant que référence web, ces méthodes me retournent un objet ayant la valeur null (J'étais parti sur cela aussi au début). En l'implémentant dans une classe, j'ai la possibilité de modifier quelques valeurs pour avancer.

    Les résultats de cette recherche sont les suivantes :

    - Les méthodes issues de la classe générée me retournait la même valeur null, en ajoutant "Form = System.Xml.Schema.XmlSchemaForm.Unqualified" au niveau de la méthode, cela m'instancie un objet mais les valeurs ne sont pas affectées.

    - Sur les rares forums parlant du sujet il 'agirait d'un problème de namespace, j'ai essayé plein de combinaison sans succès.

    - Si je retourne le type objet au lieu de VersionInfoResponse, je reçoit un tableau de xmlnodes, chacun contenant les valeurs des variables retournées par le webservice. Je reçois donc bien une réponse du web service, mais la sérialisation pose problème.

    -Le problème ne vient pas du paramètre envoyé.

    -Des clients java fonctionnent avec mais j'en ai pas à disposition.

    -le contenu SOAP retourné est le suivant :

    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
     
     
      <?xml version="1.0" encoding="UTF-8" ?> 
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
    <getPegasusVersionInfoResponse xmlns="">
    <getPegasusVersionInfoReturn>
    <build>84</build> 
    <date>2007/07/23 21:19</date> 
    <major>1</major> 
    <minor>0</minor> 
    <revision>1</revision> 
    <status>200</status> 
    <statusText xsi:nil="true" /> 
    </getPegasusVersionInfoReturn>
    </getPegasusVersionInfoResponse>
    </soapenv:Body>
    </soapenv:Envelope>

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 18
    Points
    18
    Par défaut Solution Axis/.Net
    Les type complexes en Axis sont généralement auto générés (WSDL2Java), l’autogenration --> mauvaises surprises. C’est ce se passe dans ton cas.
    La réponse retournée par le service web Axis est le suivant : (Fiddler c’est l’outil que j’ai utilisé pour tracer la com entre le Sw et l’appli de test) :
    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
    <?xml version="1.0" encoding="utf-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
    <getPegasusVersionInfoResponse xmlns="urn:axis.server.cat.tecdoc.net">
    <getPegasusVersionInfoReturn xmlns="">
    <build>84</build>
    <date>2007/07/23 21:19</date>
    <major>1</major>
    <minor>0</minor>
    <revision>1</revision>
    <status>200</status>
    <statusText xsi:nil="true"/>
    </getPegasusVersionInfoReturn>
    </getPegasusVersionInfoResponse>
    </soapenv:Body>
    </soapenv:Envelope>
    Le message SOAP retourné a l’air clean, en plus en referencant le service web à partir de l’appli de test on n’a pas d’exception remontée mais un object NULL !! il y a donc un probleme lors de la désérialisation !!! Pour adapter ce process t’as bien fait de générer ton Proxy (WSDL.exe) :

    Analysant le code qui concerne la web method en question :
    • Type retourné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://datatype.cat.tecdoc.net")]
    public partial class VersionInfoResponse {
    Première incohérence le namespace : http://datatype.cat.tecdoc.net ne figure pas dans la réponse SOAP ! donc comme tous bon développeur on vire cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
        [System.SerializableAttribute()]
        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.ComponentModel.DesignerCategoryAttribute("code")]
        public partial class VersionInfoResponse
        {
    • Web Method:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestNamespace="urn:axis.server.cat.tecdoc.net", ResponseNamespace="urn:axis.server.cat.tecdoc.net", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        [return: System.Xml.Serialization.XmlElementAttribute("getPegasusVersionInfoReturn")]
        public VersionInfoResponse getPegasusVersionInfo(VersionInfoRequest in0) {
    Les attributs SoapDocumentMethodAttribute correspondent au Message SOAP retourné !
    Passant au type retourné : System.Xml.Serialization.XmlElementAttribute("getPegasusVersionInfoReturn")Donc le serializer va se baser sur les Eléments contenus dans getPegasusVersionInfoReturn pour déserializer l’object VersionInfoResponse
    La réponse SOAP et les SoapDocumentMethodAttribute indique que le namespace de la réponse est : urn:axis.server.cat.tecdoc.net
    Le serialzer va donc va reconstruire l’object VersionInfoResponse à partir de l’XML contenu dans l’element getPegasusVersionInfoReturn et qui appartiennent au namespace urn:axis.server.cat.tecdoc.net OR l’Element getPegasusVersionInfoReturn définit son propre namespace getPegasusVersionInfoReturn xmlns=""> et c’est pour ca qu’on a un object null en retour ! ce xmlns="" est probalement le fruit de l’autogeneration !! !
    Solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestNamespace = "urn:axis.server.cat.tecdoc.net", ResponseNamespace = "urn:axis.server.cat.tecdoc.net", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
            [return: System.Xml.Serialization.XmlElementAttribute(ElementName="getPegasusVersionInfoReturn",Namespace="")]
            public VersionInfoResponse getPegasusVersionInfo(VersionInfoRequest in0)

    RCH
    MCSD MCDBA MCPD
    SCJP SCWCD SCBCD
    Images attachées Images attachées  

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Merci Roshdy !

    Effectivement j'avais remarqué ce xlns="" et je me douté que c'était le coupable, mais je ne savais pas comment le répercuter dans le code !

    J'ai le même problème au niveau d'objets de réponse qui contiennent des tableaux d'objets, mais grâce à tes explications, j'ai réussi à le résoudre donc en gros c'est suppression des namespaces et affectation des noeuds aux objets avec "Elementname=" nomdunoeud.

    Tu m'enlèves une belle épine du pied.

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Comment tu as réussi à lire les types complexes (arrays), que
    modifications tu as fait dans la proxy ? à moi retourne toujours vide

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/08/2010, 14h19
  2. Appeler un service web hosté par une application ASP.Net
    Par Zoizoi dans le forum Services Web
    Réponses: 5
    Dernier message: 14/07/2009, 17h30
  3. Réponses: 6
    Dernier message: 22/06/2007, 15h34
  4. Réponses: 1
    Dernier message: 26/02/2007, 09h44
  5. Réponses: 3
    Dernier message: 18/12/2006, 15h15

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