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

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

將自動(dòng)生成

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

查看命名空間 并引用


//創(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

剛開始采用如下方法
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)訪問

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
文檔如下

那么應(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)求 和返回。

可以看到 為xmlxml。
最后還有一種方式最麻煩的調(diào)用,就是安卓這邊要調(diào)用 則找到soap 插件庫,調(diào)用這么個(gè)落后的東西搞那么多麻煩事情。
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ù)就是正常的表單傳遞了