2017-10-13 5 views
1

SOAP 응답에서 오는 배열의 비 직렬화에 문제가 있습니다. 그것은 null을 반환하지만, 응답으로 나는 정확한 xml 메시지를 실제로 볼 수 있습니다. 어쩌면 누군가 내 코드에서 무엇이 잘못되었는지 알 수 있습니다. 미리 감사드립니다.HttpClient를 사용하여 SOAP 서비스 사용하기

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> 

응답 모델 :

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

구문 분석 방법 : 당신의 XML LINQ를 사용할 수있는 간단한 XML을위한

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 디시리얼라이시 방법이 누락되었습니다. –

+0

내 대답을 확인 했습니까? –

+0

예, 감사합니다. 필자가 실제로 필요했던 것은 모델을 사용자가 제공 한 것처럼 보이도록 수정하는 것입니다. – George

답변

1

왜 그냥 경우 유하여 XDocument 및 질의를 필요 없어요, 전체 개체를 deserilize하지 여전히 XDocument를 사용하여 yr 방식으로 가고 싶습니다. yr Deserialize 메서드는 정의한 것과 동일해야합니다. 시도하지 않으려는 경우 :

0

. 아래를 참조 코드 : 당신이 경우

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

:

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

} 

및 예멘 아랍 공화국 역 직렬화 방법 :

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;} 

    } 
} 
관련 문제