2017-10-13 10 views
1

J'ai un problème avec la désérialisation d'un tableau qui provient de la réponse SOAP. Il renvoie null, mais en réponse, je peux réellement voir un message xml correct. Peut-être que quelqu'un peut voir ce qui ne va pas dans mon code. Merci d'avance.Consommation d'un service SOAP à l'aide de HttpClient

réponse SOAP:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns-wp="imcwp" xmlns:ns-hostax="imchostax" xmlns:ns-ilms="imcilms" xmlns:ns-qtms="imcqtms" xmlns:ns-tptms="imctptms"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
     <ns-wp:strTrailerRequest-TrailerResponse> 
     <ns-wp:Trailer> 
      <ns-wp:TrailerId>T001</ns-wp:TrailerId> 
      <ns-wp:TrailerType>Flat Extender</ns-wp:TrailerType> 
     </ns-wp:Trailer> 
     <ns-wp:Trailer> 
      <ns-wp:TrailerId>T002</ns-wp:TrailerId> 
      <ns-wp:TrailerType>Flat Extender</ns-wp:TrailerType> 
     </ns-wp:Trailer> 
     <ns-wp:Trailer> 
      <ns-wp:TrailerId>T003</ns-wp:TrailerId> 
      <ns-wp:TrailerType>Flat Extender</ns-wp:TrailerType> 
     </ns-wp:Trailer> 
     </ns-wp:strTrailerRequest-TrailerResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Modèle de réponse:

[XmlRoot(ElementName = "strTrailerRequest-TrailerResponse", Namespace = "imcwp")] 
public class strTrailerRequestTrailerResponse 
{ 
    [XmlArray("strTrailerRequest-TrailerResponse", Namespace = "imcwp")] 
    [XmlArrayItem("Trailer", Namespace = "imcwp")] 
    public List<Trailer> Trailers { get; set; } 
} 

Parse Méthode:

private strTrailerRequestTrailerResponse ParseTrailerResponse(string response) 
    { 
     var soap = XDocument.Parse(response); 
     XNamespace ns = "imcwp"; 

     var trailerResponseNode = soap.Descendants(ns + "strTrailerRequest-TrailerResponse").FirstOrDefault().ToString(); 
     var result = Deserialize<strTrailerRequestTrailerResponse>(trailerResponseNode); 

     return result; 
    } 
+0

yr La méthode de désérialisation est manquante –

+0

Avez-vous vérifié ma réponse? –

+0

oui, merci. Tout ce dont j'ai réellement besoin est de modifier le modèle pour ressembler au vôtre que vous avez fourni. – George

Répondre

1

Pourquoi ne pas simplement deserilize l'objet entier, dans ce cas, u ne avez pas besoin XDocument et l'interrogation:

var envelop = Deserialize<Envelope>(response); 
foreach (var strTrailerRequestTrailerResponseTrailer in envelop.Body.strTrailerRequestTrailerResponse) 
{ 

} 

et méthode an Désérialiser:

public static T Deserialize<T>(string response) 
{ 
    var serializer = new XmlSerializer(typeof(T)); 
    using(TextReader reader = new StringReader(response)) 
    { 
     return (T)serializer.Deserialize(reader); 
    } 
} 

Si vous veux toujours aller avec yr en utilisant XDocument, c'est ok yr La méthode Deserialize devrait être la même que j'ai définie. si vous n'essayez pas:

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "imcwp")] 
public partial class strTrailerRequestTrailerResponseTrailer 
{ 
    public string TrailerId { get; set; } 

    public string TrailerType { get; set; } 
} 

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "imcwp")] 
[System.Xml.Serialization.XmlRootAttribute("strTrailerRequest-TrailerResponse", Namespace = "imcwp", IsNullable = false)] 
public partial class strTrailerRequestTrailerResponse 
{ 
    [System.Xml.Serialization.XmlElementAttribute("Trailer")] 
    public strTrailerRequestTrailerResponseTrailer[] Trailer { get; set; } 
} 
0

Pour xml simple, vous pouvez utiliser xml LINQ. Voir le code ci-dessous:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Xml; 
using System.Xml.Linq; 
using System.IO; 

namespace Certificate 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      string xml = File.ReadAllText(FILENAME); 
      XDocument doc = XDocument.Parse(xml); 

      XElement soap = doc.Root; 
      XNamespace ns = soap.GetNamespaceOfPrefix("ns-wp"); 


      List<Trailer> trailers = doc.Descendants(ns + "Trailer").Select(x => new Trailer() 
      { 
       trailerId = (string)x.Element(ns + "TrailerId"), 
       trailerType = (string)x.Element(ns + "TrailerType") 
      }).ToList(); 
     } 

    } 
    public class Trailer 
    { 
     public string trailerId { get; set; } 
     public string trailerType { get;set;} 

    } 
}