none
Deserialisieren einer SOAP Antwort RRS feed

  • Frage

  • Hi NG,

    danke der Hilfe von Thomas vor einiger Zeit, habe ich jetzt versucht seine Idee um unter .NET Core mit einem SOAP-Server zu kommunizieren.  Ich baue mir den String für die Abfrage zusamen und sende Ihn. Das ist kein großer Aufwand und klappt prima.

    Mein Problem besteht jetzt daraus, wie komme ich an die empfangenden Daten ran. Ich erhalte z.B. Folgende Antwort vom Server:

    <?xml version="1.0"?>
    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> 
    	 <soap:Body> 
    		<ns2:get_customer_response xmlns:ns2="http://abc.abcde-ag.com/tip5/provisioning" return_type="2" result="true">
    			<customer_data activecount="0" usercount="15" description="Test-2014">
    				<customer_id><customer name="130000" id="163"/></customer_id>
    				<preferences>
    					<keep_alive_interval>35</keep_alive_interval>
    					<position_send_interval>31</position_send_interval>
    					<position_measure_interval>30</position_measure_interval>
    					<position_min_delta>50</position_min_delta>
    					<position_method_forced>1</position_method_forced>
    					<volume_voice_forced>100</volume_voice_forced>
    					<volume_signal_forced>100</volume_signal_forced>
    					<volume_voice_boost_forced>-1</volume_voice_boost_forced>
    					<store_days_cdr>65</store_days_cdr>
    					<store_days_user_login_history>180</store_days_user_login_history>
    					<store_days_user_status_history>181</store_days_user_status_history>
    					<store_days_user_group_history>182</store_days_user_group_history>
    					<store_days_user_location_history>185</store_days_user_location_history>
    					<store_days_voice_data>183</store_days_voice_data>
    					<store_megabytes_voice_data>184</store_megabytes_voice_data>
    					<connection_encryption>-1</connection_encryption>
    					<client_settings_passcode>12345</client_settings_passcode>
    					<client_geo_layer>-1</client_geo_layer>
    				</preferences>
    				<home_position latitude="0.0" longitude="0.0"/>
    				<supported_by><customer name="130000" id="163"/></supported_by>
    			</customer_data>
    		</ns2:get_customer_response> 
    	 </soap:Body> 
    </soap:Envelope> 

    Ich habe eine xsd Datei und mit dem Hilfsprogramm xsd.exe eine c# Datei erstellt. Leider ist mir völlig unklar wie ich nun an die Daten deserialisieren kann um mit Ihnen zu arbeiten.

    Ich habe die beiden Datein zum download frei gegeben. Die Dateien

    Danke im voraus für jeden Hinweis und Tipp.

    Grüße Ingo

    Freitag, 11. Mai 2018 10:57

Antworten

  • Hallo Ingo,

    erzeuge dir einfach eine Klasse aus dem XML wie z.B. hier beschrieben Method 2 - Paste special und parse es nur noch.

    In diesem Beispiel habe ich dem XML Baum in einer Datei gespeichert XMLTest.xml

    using System;
    using System.IO;
    using System.Xml;
    using System.Xml.Serialization;
    
    namespace ConsoleApp4
    {
        class Program
        {
            static void Main(string[] args)
            {
                var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "XMLTest.xml");
    
                using (var fs = new FileStream(file, FileMode.Open))
                {
                    using (var reader = XmlReader.Create(fs))
                    {
                        XmlSerializer serializer = new XmlSerializer(typeof(Envelope));
                        Envelope envelope = (Envelope)serializer.Deserialize(reader);
                    }
                }
                
                Console.WriteLine("Hello World!");
            }
        }
    }

    Gruß, Thomas


    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: Icon für UWP, UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App

    • Als Antwort markiert IngoManthey Samstag, 12. Mai 2018 12:45
    • Tag als Antwort aufgehoben IngoManthey Samstag, 12. Mai 2018 12:48
    • Als Antwort markiert IngoManthey Samstag, 12. Mai 2018 12:49
    Freitag, 11. Mai 2018 21:00
  • Hi Thomas,

    um ehrlich zu sein Dein past-spezial verstehe ich nicht so ganz. Da ich mit den empfangenen Daten auch antworten muss so denke ich das mein Weg (Klassen auf dem XML nach SOAP) der Trotzdem 1.000 Dank für Deine Unterstützung.

    Da Du dich sehr gut mit SOAP auskennst eine zusätzliche Frage.

    Ich muss zum Server ein Image übertragen.Ist es richtig dass ich aus dem Image einn es auf byte array erzeugen muss und dann Konvertieren muss auf Base64 ??? Ich kann meine Daten nur mit großem Aufwand in Bezug auf das Image testen.

    Grüße Ingo 


    • Als Antwort markiert IngoManthey Sonntag, 13. Mai 2018 21:20
    Sonntag, 13. Mai 2018 00:30

Alle Antworten

  • Hallo Ingo,

    erzeuge dir einfach eine Klasse aus dem XML wie z.B. hier beschrieben Method 2 - Paste special und parse es nur noch.

    In diesem Beispiel habe ich dem XML Baum in einer Datei gespeichert XMLTest.xml

    using System;
    using System.IO;
    using System.Xml;
    using System.Xml.Serialization;
    
    namespace ConsoleApp4
    {
        class Program
        {
            static void Main(string[] args)
            {
                var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "XMLTest.xml");
    
                using (var fs = new FileStream(file, FileMode.Open))
                {
                    using (var reader = XmlReader.Create(fs))
                    {
                        XmlSerializer serializer = new XmlSerializer(typeof(Envelope));
                        Envelope envelope = (Envelope)serializer.Deserialize(reader);
                    }
                }
                
                Console.WriteLine("Hello World!");
            }
        }
    }

    Gruß, Thomas


    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: Icon für UWP, UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App

    • Als Antwort markiert IngoManthey Samstag, 12. Mai 2018 12:45
    • Tag als Antwort aufgehoben IngoManthey Samstag, 12. Mai 2018 12:48
    • Als Antwort markiert IngoManthey Samstag, 12. Mai 2018 12:49
    Freitag, 11. Mai 2018 21:00
  • Hi Thomas,

    leider ging es nicht so. Aus einem mir nicht zu erklärenden Grund wurden nicht alles Klasse welcher in der XSD Datei waren erzeugt.

    Ich habe einfach die Klassen für das Deserialisieren selbst geschrieben. Habe aus der response einfach die Envelope und den Body entfernt. Danach hatte ich keine Probleme mehr mit dem Deserialisieren.

    Danke für die Hilfe.

    Grüße Ingo


     
    Samstag, 12. Mai 2018 12:48
  • Ich hatte auch problem aus der xsd die Klassen zu erstellen. Deswegen habe ich auch vorgeschlagen aus der XML mit "Parse special" die Klassen zu erzeug. Damit gab es keine probleme

    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: Icon für UWP, UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App

    • Als Antwort markiert IngoManthey Sonntag, 13. Mai 2018 00:19
    • Tag als Antwort aufgehoben IngoManthey Sonntag, 13. Mai 2018 00:30
    Samstag, 12. Mai 2018 21:03
  • Hi Thomas

    1.000 Dank für Deine Hilfe.

    Ingo

    • Als Antwort markiert IngoManthey Sonntag, 13. Mai 2018 00:23
    • Tag als Antwort aufgehoben IngoManthey Sonntag, 13. Mai 2018 00:23
    Sonntag, 13. Mai 2018 00:20
  • Hi Thomas,

    um ehrlich zu sein Dein past-spezial verstehe ich nicht so ganz. Da ich mit den empfangenen Daten auch antworten muss so denke ich das mein Weg (Klassen auf dem XML nach SOAP) der Trotzdem 1.000 Dank für Deine Unterstützung.

    Da Du dich sehr gut mit SOAP auskennst eine zusätzliche Frage.

    Ich muss zum Server ein Image übertragen.Ist es richtig dass ich aus dem Image einn es auf byte array erzeugen muss und dann Konvertieren muss auf Base64 ??? Ich kann meine Daten nur mit großem Aufwand in Bezug auf das Image testen.

    Grüße Ingo 


    • Als Antwort markiert IngoManthey Sonntag, 13. Mai 2018 21:20
    Sonntag, 13. Mai 2018 00:30
  • Wenn der Server Dateien als Base64 erwartet musst Du sie auch so versenden. Es ist in der tat auch der einfachste weg.

    static void Main(string[] args)
            {
                var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "XMLTest.xml");
    
                var b = System.IO.File.ReadAllBytes(file);
                var b64 = Convert.ToBase64String(b);
                
                Console.WriteLine("Hello World!");
            }

    Ich teste immer gegen die Schnittstelle selbst. Gute Anbieter stellen dafür z.B. ein Testkonto zur Verfügung oder ein Testmodus. 


    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: Icon für UWP, UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App

    • Als Antwort markiert IngoManthey Sonntag, 13. Mai 2018 17:25
    • Tag als Antwort aufgehoben IngoManthey Sonntag, 13. Mai 2018 21:20
    Sonntag, 13. Mai 2018 13:24