簡體   English   中英

使用肥皂網絡服務的.net核心控制台應用程序出現問題

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

我是.net核心的新手,我正在嘗試創建一個控制台應用程序,該控制台應用程序在.net核心項目中使用SOAP Web服務。 我一直在尋找圖書館,但找不到任何圖書館。 我開始編碼,並將其傳遞到可以從SOAP請求接收XML的Point。 現在我的問題是,我的代碼以純文本格式打印所有XML,不是非常有用。 我試圖在XML中訪問我的數據,但沒有成功。

我這樣做太難了嗎? 有沒有一種方法或庫可以使使用起來更容易?

/// <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();
        }


這是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>

為了方便快捷地訪問值,可以使用XmlReader讀取SOAP響應,以從每個XmlElement查找LocalName / Value映射,然后將結果存儲在NameValueCollection (或您可能喜歡的任何ICollection )中:

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

要獲取任何XmlElement的字符串值,您需要通過已知鍵(沒有名稱空間前綴)訪問NameValueCollection 例如:

nameValueCollection["fehlerCode"]

示例AllKeys和值的輸出:

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

以下代碼可以很好地打印出所有內容

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM