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

Windows Forms Discussion :

Création d'un objet XML - Serialization SOAP-XML pour envoi en HTTP POST.


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Points : 106
    Points
    106
    Par défaut Création d'un objet XML - Serialization SOAP-XML pour envoi en HTTP POST.
    Bonjour,

    Je souhaiterais connaitre la meilleure méthode pour manipuler de l'XML, afin qu'il soit sérialisé.

    Pour l'instant, je procède à l'ancienne dans le sens où j'utilise un String dans lequel je vais stocker ma requête et l'envoyer sur le réseau en HTTP POST.

    Cela fonctionne très bien, mais ça ne fait pas très ".NET" je trouve ...

    J'aimerais donc, connaitre la meilleure manière de sérialiser le contenu suivant, dans un ou des objets qui seront envoyé de la meme maniere, via une HttpWebRequest & Stream :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://schemas.cisco.com/ast/soap/" xmlns:types="http://schemas.cisco.com/ast/soap/encodedTypes" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">	<SOAP-ENV:Header>
    		<tns:AstHeader id="id1">
    			<SessionId xsi:type="xsd:string">SessionId</SessionId>
    		</tns:AstHeader>
    	</SOAP-ENV:Header>
    	<SOAP-ENV:Body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    		<tns:SelectCmDevice>
    			<CmSelectionCriteria href="#id1"/>
    		</tns:SelectCmDevice>
    		<tns:CmSelectionCriteria id="id1" xsi:type="tns:CmSelectionCriteria">
    			<MaxReturnedDevices xsi:type="xsd:unsignedInt">4294967295</MaxReturnedDevices>
    			<Class xsi:type="xsd:string">Phone</Class>
    			<Model xsi:type="xsd:unsignedInt">255</Model>
    			<Status xsi:type="xsd:string">Any</Status>
    			<SelectBy xsi:type="tns:CmSelectBy">Name</SelectBy>
    		<SelectItems href="#id2"/></tns:CmSelectionCriteria>
    		<soapenc:Array id="id2" soapenc:arrayType="tns:SelectItem[1]">
    			<Item href="#id3"/>
    		</soapenc:Array>
    		<tns:SelectItem id="id3" xsi:type="tns:SelectItem">
    			<Item xsi:type="xsd:string">SEP*****</Item>
    		</tns:SelectItem>
    	</SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    On peut remarque que j'utilise SOAP pour l'envoi des requête.
    Je peux peut-être utiliser les classes SOAP appropriées pour la requête.

    Honnêtement, je ne sais pas vraiment comment m'y prendre pour créer un tel objet et le sérialiser pour être envoyé.

    Dans le sens inverse, lorsque je reçois ma réponse, aucun soucis, j'utilise l'objet XmlDocument pour être parsé et ensuite parcouru pour aller rechercher les infos dans les noeuds que j'ai besoin.

    Quelqu'un aurait-il une aide, un tuto, ou me dire comment procéder avec exemple ?

    Merci d'avance.

  2. #2
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Points : 106
    Points
    106
    Par défaut
    Bon, je me suis lancé.

    Je ne trouve pas bcp d'info la dessus, face au problème que je rencontre.


    Voici mon code :

    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
    XmlDocument doc = new XmlDocument();
            XmlDeclaration xmlDeclaration = doc.CreateXmlDeclaration("1.0", "UTF-8", null);        
            XmlElement Envelope = doc.CreateElement("SOAP-ENV", "Envelope", "http://schemas.xmlsoap.org/soap/envelope/");        
     
            XmlAttribute soapenc = doc.CreateAttribute("soapenc", "xmlns", "http://schemas.xmlsoap.org/soap/encoding/");
            XmlAttribute tns = doc.CreateAttribute("tns", "xmlns", "http://schemas.cisco.com/ast/soap/");
            XmlAttribute types = doc.CreateAttribute("types", "xmlns", "http://schemas.cisco.com/ast/soap/encodedTypes");
            XmlAttribute xsd = doc.CreateAttribute("xsd", "xmlns", "http://www.w3.org/2001/XMLSchema");
            XmlAttribute xsi = doc.CreateAttribute("xsi", "xmlns", "http://www.w3.org/2001/XMLSchema-instance");
            Envelope.SetAttributeNode(soapenc);
            Envelope.SetAttributeNode(tns);
            Envelope.SetAttributeNode(types);
            Envelope.SetAttributeNode(xsd);
            Envelope.SetAttributeNode(xsi);
     
            doc.InsertBefore(xmlDeclaration, doc.DocumentElement);
            doc.AppendChild(Envelope);
     
            XmlElement AstHeader = doc.CreateElement("tns", "AstHeader", null);
            doc.AppendChild(AstHeader);

    Il y a une exception qui se déclenche à la dernière ligne :

    InvalidOperationException : Ce document a déjà un noeud 'DocumentElement'.

    Je ne comprends pas bien ...

    Quelqu'un pourrait éclaircir ma lanterne pour réussir à sérialiser ce document pour éviter de manipuler des strings ?

  3. #3
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    J'aurais bien envie de te conseiller de passer par la classe SoapFormatter (http://msdn2.microsoft.com/en-us/lib...formatter.aspx) plutôt que de réinventer la roue:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void SOAPSerialize(string filename,Employee employeeObject)
     {
       FileStream fileStreamObject = new FileStream(filename, FileMode.Create);
       SoapFormatter soapFormatter = new SoapFormatter();
       soapFormatter.Serialize(fileStreamObject, employeeObject);
       fileStreamObject.Close();
     }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static object SOAPDeserialize(string filename)
     {
       FileStream fileStreamObject = new FileStream(filename, FileMode.Open);
       SoapFormatter soapFormatter = new SoapFormatter();
       object obj = (object)soapFormatter.Deserialize(fileStreamObject);
       fileStreamObject.Close();
       return obj;
     }

  4. #4
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Points : 106
    Points
    106
    Par défaut
    Merci pour ta réponse.

    Mais j'ai finalement décidé de procéder avec les objets XML pour être certain que ma requête soit correcte.

    Voici mon code pour ceux que ça interesse :

    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
    128
    129
    130
    131
    132
    XmlDocument doc = new XmlDocument();
            XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
            doc.AppendChild(docNode);        
     
            XmlNode Envelope = doc.CreateElement("SOAP-ENV", "Envelope", "http://schemas.xmlsoap.org/soap/envelope/");
            XmlAttribute soapenc = doc.CreateAttribute("soapenc", "xmlns", "http://schemas.xmlsoap.org/soap/encoding/");        
            XmlAttribute tns = doc.CreateAttribute("tns", "xmlns", "http://schemas.cisco.com/ast/soap/");
            XmlAttribute types = doc.CreateAttribute("types", "xmlns", "http://schemas.cisco.com/ast/soap/encodedTypes");
            XmlAttribute xsd = doc.CreateAttribute("xsd", "xmlns", "http://www.w3.org/2001/XMLSchema");
            XmlAttribute xsi = doc.CreateAttribute("xsi", "xmlns", "http://www.w3.org/2001/XMLSchema-instance");
            Envelope.Attributes.Append(soapenc);
            Envelope.Attributes.Append(soapenc);
            Envelope.Attributes.Append(tns);
            Envelope.Attributes.Append(types);
            Envelope.Attributes.Append(xsd);
            Envelope.Attributes.Append(xsi);        
            doc.AppendChild(Envelope);
     
            XmlNode Header = doc.CreateElement("SOAP-ENV", "Header", "http://schemas.xmlsoap.org/soap/envelope/" );        
            Envelope.AppendChild(Header);        
     
            XmlNode AstHeader = doc.CreateElement("tns", "AstHeader", "http://schemas.cisco.com/ast/soap/");        
            XmlAttribute xmlID = doc.CreateAttribute("id");
            xmlID.Value = "id1"; 
            AstHeader.Attributes.Append(xmlID);
            Header.AppendChild(AstHeader);            
     
            XmlNode SessionId = doc.CreateElement("SessionId");
            XmlAttribute xsiType = doc.CreateAttribute("xsi", "type", "http://www.w3.org/2001/XMLSchema-instance");
            xsiType.Value = "xsd:string";
            SessionId.Attributes.Append(xsiType);
            SessionId.AppendChild(doc.CreateTextNode("SessionId")); //valeur à l'intérieur
            AstHeader.AppendChild(SessionId);
     
            XmlNode Body = doc.CreateElement("SOAP-ENV", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
            XmlAttribute encodingStyle = doc.CreateAttribute("encodingStyle");
            encodingStyle.Value = "http://schemas.xmlsoap.org/soap/encoding/";
            Body.Attributes.Append(encodingStyle);
            Envelope.AppendChild(Body);
     
            XmlNode SelectCmDevice = doc.CreateElement("tns", "SelectCmDevice", "http://schemas.cisco.com/ast/soap/");
            Body.AppendChild(SelectCmDevice);
     
            XmlNode CmSelectionCriteria = doc.CreateElement("CmSelectionCriteria");
            XmlAttribute href = doc.CreateAttribute("href");
            href.Value = "#id1";
            CmSelectionCriteria.Attributes.Append(href);
            SelectCmDevice.AppendChild(CmSelectionCriteria);
     
            XmlNode CmSelectionCriteriaTNS = doc.CreateElement("tns", "CmSelectionCriteria", "http://schemas.cisco.com/ast/soap/");
            xmlID = doc.CreateAttribute("id");
            xmlID.Value = "id1";
            xsiType = doc.CreateAttribute("xsi", "type", "http://www.w3.org/2001/XMLSchema-instance");
            xsiType.Value = "tns:CmSelectionCriteria";
            CmSelectionCriteriaTNS.Attributes.Append(xmlID);
            CmSelectionCriteriaTNS.Attributes.Append(xsiType);
            Body.AppendChild(CmSelectionCriteriaTNS);
     
            XmlNode MaxReturnedDevices = doc.CreateElement("MaxReturnedDevices");
            xsiType = doc.CreateAttribute("xsi", "type", "http://www.w3.org/2001/XMLSchema-instance");
            xsiType.Value = "xsd:unsignedInt";
            MaxReturnedDevices.Attributes.Append(xsiType);
            MaxReturnedDevices.AppendChild(doc.CreateTextNode("4294967295"));
            CmSelectionCriteriaTNS.AppendChild(MaxReturnedDevices);
     
            XmlNode Class = doc.CreateElement("Class");
            xsiType = doc.CreateAttribute("xsi", "type", "http://www.w3.org/2001/XMLSchema-instance");
            xsiType.Value = "xsd:string";
            Class.Attributes.Append(xsiType);
            Class.AppendChild(doc.CreateTextNode("Phone"));
            CmSelectionCriteriaTNS.AppendChild(Class);
     
            XmlNode Model = doc.CreateElement("Model");
            xsiType = doc.CreateAttribute("xsi", "type", "http://www.w3.org/2001/XMLSchema-instance");
            xsiType.Value = "xsd:unsignedInt";
            Model.Attributes.Append(xsiType);
            Model.AppendChild(doc.CreateTextNode("255"));
            CmSelectionCriteriaTNS.AppendChild(Model);
     
            XmlNode Status = doc.CreateElement("Status");
            xsiType = doc.CreateAttribute("xsi", "type", "http://www.w3.org/2001/XMLSchema-instance");
            xsiType.Value = "xsd:string";
            Status.Attributes.Append(xsiType);
            Status.AppendChild(doc.CreateTextNode("Any"));
            CmSelectionCriteriaTNS.AppendChild(Status);
     
            XmlNode SelectBy = doc.CreateElement("SelectBy");
            xsiType = doc.CreateAttribute("xsi", "type", "http://www.w3.org/2001/XMLSchema-instance");
            xsiType.Value = "tns:CmSelectBy";
            SelectBy.Attributes.Append(xsiType);
            SelectBy.AppendChild(doc.CreateTextNode("Name"));
            CmSelectionCriteriaTNS.AppendChild(SelectBy);
     
            XmlNode SelectItems = doc.CreateElement("SelectItems");
            href = doc.CreateAttribute("href");
            href.Value = "#id2";
            SelectItems.Attributes.Append(href);
            CmSelectionCriteriaTNS.AppendChild(SelectItems);
     
            XmlNode soapencArray = doc.CreateElement("soapenc", "Array", "http://schemas.xmlsoap.org/soap/encoding/");
            xmlID = doc.CreateAttribute("id");
            xmlID.Value = "id2";
            XmlAttribute ArrayType = doc.CreateAttribute("soapenc", "arrayType", "http://schemas.xmlsoap.org/soap/encoding/");
            ArrayType.Value = "tns:SelectItem[1]";
            soapencArray.Attributes.Append(xmlID);
            soapencArray.Attributes.Append(ArrayType);
            Body.AppendChild(soapencArray);
     
            XmlNode Item = doc.CreateElement("Item");
            href = doc.CreateAttribute("href");
            href.Value = "#id3";
            Item.Attributes.Append(href);
            soapencArray.AppendChild(Item);
     
            XmlNode SelectItem = doc.CreateElement("tns", "SelectItem", "http://schemas.cisco.com/ast/soap/");
            xmlID = doc.CreateAttribute("id");
            xmlID.Value = "id3";
            xsiType = doc.CreateAttribute("xsi", "type", "http://www.w3.org/2001/XMLSchema-instance");
            xsiType.Value = "tns:SelectItem";
            SelectItem.Attributes.Append(xmlID);
            SelectItem.Attributes.Append(xsiType);
            Body.AppendChild(SelectItem);
     
            Item = doc.CreateElement("Item");
            xsiType = doc.CreateAttribute("xsi", "type", "http://www.w3.org/2001/XMLSchema-instance");
            xsiType.Value = "xsd:string";
            Item.Attributes.Append(xsiType);
            //Item.AppendChild(doc.CreateTextNode("*")); // Si on les veut tous...
            Item.AppendChild(doc.CreateTextNode(phoneName)); // <---- Ici on place le nom de la recherche du téléphone ciblé.
            SelectItem.AppendChild(Item);
     
            Request = doc.InnerXml;
    Le code correspond à la requête SOAP XML que j'ai laissée dans le 1ier post.

    Cela fonctionne parfaitement.

    Par contre, est-ce plus interessant de procéder de cette façon, que de procéder avec un String directement ?
    Avec un String, où j'inscrivais toute ma requête directement, j'arrivais à +/- 30 lignes.
    Ici, j'en suis à 130 lignes +/- de code.

    Est-ce donc vraiment plus interessant de passer avec les XmlNode et consort pour créer une requête et l'envoyer ?

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Et en passant par la méthode que je t'ai conseillé, tout simplement? Ce serait plus simple je pense

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Bonjour,

    Citation Envoyé par ExSter Voir le message
    Avec un String, où j'inscrivais toute ma requête directement, j'arrivais à +/- 30 lignes.
    Ici, j'en suis à 130 lignes +/- de code.
    C'est pas le nombre de lignes qui importe mais plutôt la simplicité du code. Le mieux c'est d'avoir le moins de code possible (en invoquant des méthodes prééxistantes) dans une méthode existe cela permet une meilleure maintenance de celui ci (où l'intérêt de la factorisation de méthode).

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 31/12/2009, 10h27
  2. Xml Serialization ne crée pas les objets que je veux
    Par FadeOut dans le forum C++/CLI
    Réponses: 1
    Dernier message: 17/03/2009, 12h36
  3. Réponses: 4
    Dernier message: 02/12/2008, 12h00
  4. [SAX] Passer d'objet java en fichier XML?
    Par spoutyoyo dans le forum Format d'échange (XML, JSON...)
    Réponses: 15
    Dernier message: 05/01/2005, 08h31
  5. [SOAP] [XML-RPC] la différence
    Par david42 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 02/03/2004, 08h52

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