简体   繁体   中英

Issue with an console app with .net core which uses a soap web service

I'm new to .net core and I'm trying to create a console application which is using a SOAP web Service in my .net core project. I have been looking for libraries but couldnt find any. I started coding and got it to the Point where I am able to receive the XML from the SOAP request. My problem now is, my Code, which prints all of the XML in plain text, isnt very usable. Im trying to access my data within the XML, but without success.

Am I doing this way too difficult? Is there a way or library to use which makes it easier?

/// <summary>
        /// Execute a Soap WebService call
        /// </summary>
        public static void Execute()
        {
            HttpWebRequest request = CreateWebRequest();
            XmlDocument soapEnvelopeXml = new XmlDocument();
            soapEnvelopeXml.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8""?>
                <soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:GET-AG=""http://ortsinfoV13x0.stromgas.services.getag.com"">
                <soapenv:Header></soapenv:Header>
                <soapenv:Body>
                <GET-AG:getOrteByPlz>
                    <GET-AG:rec>
                        <GET-AG:auth_LoginName>----------</GET-AG:auth_LoginName>
                        <GET-AG:auth_Passwort>------</GET-AG:auth_Passwort>
                    </GET-AG:rec>
                <GET-AG:plz>69126</GET-AG:plz>
                </GET-AG:getOrteByPlz>
                </soapenv:Body>
                </soapenv:Envelope>"
            );

            using (Stream stream = request.GetRequestStream())
            {
                soapEnvelopeXml.Save(stream);
            }

            using (WebResponse response = request.GetResponse())
            {
                using (StreamReader rd = new StreamReader(response.GetResponseStream()))
                {
                    string soapResult = rd.ReadToEnd();
                    Console.WriteLine(soapResult);
                }
            }
        }
        /// <summary>
        /// Create a soap webrequest to [Url]
        /// </summary>
        /// <returns></returns>
        public static HttpWebRequest CreateWebRequest()
        {
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(@"----------");
            webRequest.Headers.Add(@"SOAP:Action");
            webRequest.ContentType = "text/xml;charset=\"utf-8\"";
            webRequest.Accept = "text/xml";
            webRequest.Method = "POST";
            return webRequest;
        }

        static void Main(string[] args)
        {
            Execute();
        }


This is the XML:

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <ns:getOrteByPlzResponse xmlns:ns="----------">
            <ns:return xmlns:ax215="----------" xmlns:ax213="----------" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax213:Adressinfo">
                <ax213:fehlerCode>1</ax213:fehlerCode>
                <ax213:fehlerMeldungLength>0</ax213:fehlerMeldungLength>
                <ax213:input xsi:type="ax213:AdressinfoParameter">
                    <ax213:strassenRequest xsi:nil="true"/>
                    <ax213:stringRequest>69126</ax213:stringRequest>
                    <ax213:validationsRequest xsi:nil="true"/>
                </ax213:input>
                <ax213:itag>BPTest1;;26.04.2019,15:16:21</ax213:itag>
                <ax213:ort xsi:type="ax213:Ort">
                    <ax213:alort>22810500</ax213:alort>
                    <ax213:gkz>08221000</ax213:gkz>
                    <ax213:ortsname>Heidelberg</ax213:ortsname>
                    <ax213:ortsteil>Boxberg</ax213:ortsteil>
                    <ax213:ortsteil>Emmertsgrund</ax213:ortsteil>
                    <ax213:ortsteil>Rohrbach</ax213:ortsteil>
                    <ax213:ortsteil>Südstadt</ax213:ortsteil>
                    <ax213:ortsteilLength>4</ax213:ortsteilLength>
                    <ax213:plzLength>0</ax213:plzLength>
                </ax213:ort>
                <ax213:ortLength>1</ax213:ortLength>
                <ax213:strasseLength>0</ax213:strasseLength>
                <ax213:validation xsi:nil="true"/>
            </ns:return>
        </ns:getOrteByPlzResponse>
    </soapenv:Body>
</soapenv:Envelope>

For easy and quick value access, you could use the XmlReader to read the SOAP response to find the LocalName / Value mappings from each XmlElement and then store the results in a NameValueCollection (or whatever ICollection you might prefer):

public static void Main()
{
    string strResponse = "<?xml version=\'1.0\' encoding=\'UTF-8\'?>\r\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">\r\n    <soapenv:Body>\r\n        <ns:getOrteByPlzResponse xmlns:ns=\"----------\">\r\n            <ns:return xmlns:ax215=\"----------\" xmlns:ax213=\"----------\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"ax213:Adressinfo\">\r\n                <ax213:fehlerCode>1</ax213:fehlerCode>\r\n                <ax213:fehlerMeldungLength>0</ax213:fehlerMeldungLength>\r\n                <ax213:input xsi:type=\"ax213:AdressinfoParameter\">\r\n                    <ax213:strassenRequest xsi:nil=\"true\"/>\r\n                    <ax213:stringRequest>69126</ax213:stringRequest>\r\n                    <ax213:validationsRequest xsi:nil=\"true\"/>\r\n                </ax213:input>\r\n                <ax213:itag>BPTest1;;26.04.2019,15:16:21</ax213:itag>\r\n                <ax213:ort xsi:type=\"ax213:Ort\">\r\n                    <ax213:alort>22810500</ax213:alort>\r\n                    <ax213:gkz>08221000</ax213:gkz>\r\n                    <ax213:ortsname>Heidelberg</ax213:ortsname>\r\n                    <ax213:ortsteil>Boxberg</ax213:ortsteil>\r\n                    <ax213:ortsteil>Emmertsgrund</ax213:ortsteil>\r\n                    <ax213:ortsteil>Rohrbach</ax213:ortsteil>\r\n                    <ax213:ortsteil>Südstadt</ax213:ortsteil>\r\n                    <ax213:ortsteilLength>4</ax213:ortsteilLength>\r\n                    <ax213:plzLength>0</ax213:plzLength>\r\n                </ax213:ort>\r\n                <ax213:ortLength>1</ax213:ortLength>\r\n                <ax213:strasseLength>0</ax213:strasseLength>\r\n                <ax213:validation xsi:nil=\"true\"/>\r\n            </ns:return>\r\n        </ns:getOrteByPlzResponse>\r\n    </soapenv:Body>\r\n</soapenv:Envelope>";
    NameValueCollection nameValueCollection = new NameValueCollection();
    try
    {
        using (StringReader stringReader = new StringReader(strResponse))
        {
            using (XmlReader xmlReader = XmlReader.Create(stringReader, new XmlReaderSettings()))
            {
                xmlReader.MoveToContent();

                string strKeyValue = null;
                do
                {
                    switch (xmlReader.NodeType)
                    {
                        case XmlNodeType.Text:
                            strKeyValue = xmlReader.Value;
                            break;

                        case XmlNodeType.EndElement:
                            if (!string.IsNullOrEmpty(strKeyValue))
                            {
                                nameValueCollection.Add(xmlReader.LocalName, strKeyValue);
                            }
                            break;

                        default:
                            strKeyValue = null;
                            break;
                    }
                } while (xmlReader.Read());
            }
        }
    }
    catch (Exception parentException)
    {
        Console.WriteLine(parentException);
    }
}

To obtain a string value for any XmlElement , you would need to access the NameValueCollection by the known key (without the namespace prefix). For example:

nameValueCollection["fehlerCode"]

Sample output of AllKeys and values:

Console.Write(string.Join(Environment.NewLine, nameValueCollection.AllKeys.Select(x => x + ": " + nameValueCollection[x])));

fehlerCode: 1
fehlerMeldungLength: 0
stringRequest: 69126
itag: BPTest1;;26.04.2019,15:16:21
alort: 22810500
gkz: 08221000
ortsname: Heidelberg
ortsteil: Boxberg,Emmertsgrund,Rohrbach,Südstadt
ortsteilLength: 4
plzLength: 0
ortLength: 1
strasseLength: 0

Following code will print everything out nicely

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

namespace ConsoleApplication110
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement rtn = doc.Descendants().Where(x => x.Name.LocalName == "return").FirstOrDefault();
            string output = "";
            foreach (XElement child in rtn.Descendants())
            {
                string name = child.Name.LocalName;
                if (name.Contains("validation"))
                {
                    string nil = child.Attributes().First().Value;
                    output = name + " : " + nil;
                }
                else
                {
                    output = name + " : " + (string)child;
                }
                Console.WriteLine(output);
            }
            Console.ReadLine();
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM