asp.net core api 等調(diào)用webservice以及 處理返回值踩坑之路

首先添加引用然他自動(dòng)生成文件

image.png

點(diǎn)擊go services 填寫如http://192.168.1.5/Service1.asmx 里面會(huì)加載出來記住名字 如Service1Soap
image.png

將自動(dòng)生成
image.png

下一步 默認(rèn) ,完成
然后定位項(xiàng)目文件夾
image.png

查看命名空間 并引用


image.png
image.png
       //創(chuàng)建 HTTP 綁定對(duì)象
            var binding = new BasicHttpBinding();
            //根據(jù) WebService 的 URL 構(gòu)建終端點(diǎn)對(duì)象,參數(shù)是提供的WebService地址
            var endpoint = new EndpointAddress(@"http://192.168.1.5/Service1.asmx");
            //創(chuàng)建調(diào)用接口的工廠,注意這里泛型只能傳入接口 泛型接口里面的參數(shù)是WebService里面定義的類名+Soap
            var factory = new ChannelFactory<Service1Soap>(binding, endpoint);
            //從工廠獲取具體的調(diào)用實(shí)例
            var callClient = factory.CreateChannel();
            /*          //調(diào)用具體的方法,這里是 HelloWorldAsync 方法
                      Task<HelloWorldResponse> responseTask = callClient.HelloWorldAsync(new HelloWorldRequest());
                      //獲取結(jié)果
                      HelloWorldResponse response = responseTask.Result;
                      // 獲取HelloWorld方法的返回值
                      string result1 = response.Body.HelloWorldResult;*/

            // 調(diào)用TestMethod方法,不傳遞參數(shù)
            string userid = "";
            Task<CheckUserResponse> testResponse = callClient.callAsync(new CheckUserRequest(username, password, userid, 0));

假如返回datatable ,但是實(shí)際上是System.Xml.Element
https://docs.microsoft.com/zh-cn/dotnet/api/system.xml.xmlelement?view=net-6.0

思路:成員對(duì)象的innerXml

image.png

剛開始采用如下方法

   System.Data.DataTable dataTable = new System.Data.DataTable();
            StringReader sr = new StringReader(str2);
         、//   dataTable.ReadXmlSchema("");//此方法需要readXmlSchema 
            dataTable.ReadXml(sr);*

提示錯(cuò)誤 System.InvalidOperationException:“DataTable does not support schema inference from Xml.”
解決方法是需要填寫寫入 xmlschema,但是這個(gè)東西沒有schema樣板。
改成如下即可

   System.Data.DataSet dsData = new System.Data.DataSet();
            
            dsData.ReadXml(new System.Xml.XmlTextReader(new StringReader(str2)));
            System.Data.DataTable dt = dsData.Tables["DT_Webservice"];//HH
            System.IO.FileStream stream =
    new System.IO.FileStream($@"{directory}\Schema.txt", System.IO.FileMode.Create);
            dt.WriteXmlSchema(stream);
            foreach (System.Data.DataRow dr in dt.Rows)
            {
                foreach (System.Data.DataColumn dc in dr.Table.Columns)
                {
                    string n = dc.ColumnName;
                    string value = dr[n].ToString();
                    Console.WriteLine("test:" + value + "," + n);
                }
            }

完美
其中DT_Webservice 是根據(jù) innerxml里面的節(jié)點(diǎn)得知,
innerxml大概數(shù)據(jù)集如下:

  <DocumentElement
    xmlns="">
    <DT_Webservice diffgr:id="DT_Webservice1" msdata:rowOrder="0"
        xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
        xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
                <app_desc>不告訴你</app_desc>
    </DT_Webservice>

    <DT_Webservice diffgr:id="DT_Webservice34" msdata:rowOrder="33"
        xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
        xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
        <app_desc>你號(hào)aaaa</app_desc>
    </DT_Webservice>
</DocumentElement>

當(dāng)然我認(rèn)為還有一個(gè)思路就是直接研究System.XML.element 類的用法直接遞歸
System.XML.element本身也屬于 XmlNode
每個(gè)xmlnode都包好childNodes 也就是XmlNodeList 可以直接用下標(biāo)訪問

image.png
     List<String> values = new List<string>();
                    XmlNodeList? list = a.Result.Any1?.SelectNodes("http://app_desc")??null;
         
   foreach (XmlNode current in list)
                        {

                       String currentText=current.InnerText;
}}

關(guān)于 selectNodes語法參考


注意這里AddNamespace方法的前面一個(gè)參數(shù)用于標(biāo)記這個(gè)命名空間,在下面SelectNodes方法中加上對(duì)應(yīng)的標(biāo)記。給出的這一段是為了查找數(shù)據(jù)庫連接字符串的節(jié)點(diǎn)。順便附帶扯下SelectNodes中XPath的語法:

SelectNodes("node")          從當(dāng)前子節(jié)點(diǎn)中查找節(jié)點(diǎn)

SelectNodes("/node")         從根節(jié)點(diǎn)的子節(jié)點(diǎn)中查找節(jié)點(diǎn)

SelectNodes("http://node")        從任意位置上查找名為node的節(jié)點(diǎn)

SelectNodes(".")                 選擇當(dāng)前節(jié)點(diǎn)

SelectNodes("..")                選擇當(dāng)前節(jié)點(diǎn)父節(jié)點(diǎn)

SelectNodes("http://node[1]")    選擇名為node的第一個(gè)節(jié)點(diǎn),注意這里是從1開始,不是從0開始

SelectNodes("/@name")    選擇有name屬性的節(jié)點(diǎn)

SelectNodes("/node[position() < 3]")           選擇名為node的前兩個(gè)節(jié)點(diǎn)

SelectNodes("http://node[@name]")                  選擇node節(jié)點(diǎn),并且該節(jié)點(diǎn)有name屬性

SelectNodes("http://node[@name='limit']")        選擇node節(jié)點(diǎn),并且該節(jié)點(diǎn)有name屬性,而且name屬性值為limit

SelectNodes("http://node[contains(item)]")        選擇node節(jié)點(diǎn),該節(jié)點(diǎn)存在名字item的子節(jié)點(diǎn),注意,如果有命名空間,這里要加命名空間,XX:item

SelectNodes("http://node[contains(item,‘Hello World’)]")        選擇node節(jié)點(diǎn),該節(jié)點(diǎn)存在名字item的子節(jié)點(diǎn),并且item節(jié)點(diǎn)內(nèi)容為Hello World

https://blog.csdn.net/Austin_link/article/details/45246055

除此之外 ,調(diào)用webservice采用http訪問
假設(shè)為

WebService 引用這個(gè)http://192.1.1/A.asmx
方法名為checkUser
文檔如下

image.png

那么應(yīng)該是這樣的訪問
http://192.168.1.1/A.asmx/CheckUser?sUser=1&sPwd=1&ssuserid=1&ssAllow=0

關(guān)于xml返回的 文檔 可以看到相關(guān)定義,這里方別為請(qǐng)求 和返回。


image.png

可以看到 為xmlxml。

最后還有一種方式最麻煩的調(diào)用,就是安卓這邊要調(diào)用 則找到soap 插件庫,調(diào)用這么個(gè)落后的東西搞那么多麻煩事情。

https://blog.csdn.net/lyq8479/article/details/6428288?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-2-6428288-blog-76473231.pc_relevant_vip_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-2-6428288-blog-76473231.pc_relevant_vip_default&utm_relevant_index=3

https://blog.csdn.net/yegshun/article/details/81278976?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-81278976-blog-6428288.pc_relevant_vip_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-81278976-blog-6428288.pc_relevant_vip_default&utm_relevant_index=1

2023-3-17 10:18:06

發(fā)現(xiàn)asmx里面有直接測(cè)試的,抓包后用sh調(diào)用


curl -H 'Host: 127.0.0.1:8088' -H 'Cache-Control: max-age=0' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' -H 'Origin: 127.0.0.1:8088' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' -H 'Referer: 127.0.0.1:8088/WebService1.asmx?op=SqlSP_YTL_GetMinPackMtNoData' -H 'Accept-Language: zh-CN,zh;q=0.9' --data "param=11111111111111111" --compressed 'http://127.0.0.1:8088/WebService1.asmx/FunctionName'

其中param是參數(shù)1
FunctionName是參數(shù)名
get訪問
```http://127.0.0.1:8088/WebService1.asmx?op=函數(shù)名``
可以直接進(jìn)入測(cè)試頁,實(shí)際上 里面的測(cè)試 上面的是post請(qǐng)求
也就是說post,get都可以訪問

get是
http://127.0.0.1:8088/WebService1.asmx/函數(shù)名?參數(shù)名=參數(shù)值
而post是
http://127.0.0.1:8088/WebService1.asmx/函數(shù)名
參數(shù)就是正常的表單傳遞了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容