asp.net core api 等调用webservice以及 处理返回值踩坑之路

首先添加引用然他自动生成文件

image.png

点击go services 填写如http://192.168.1.5/Service1.asmx 里面会加载出来记住名字 如Service1Soap
image.png

将自动生成
image.png

下一步 默认 ,完成
然后定位项目文件夹
image.png

查看命名空间 并引用


image.png
image.png
       //创建 HTTP 绑定对象
            var binding = new BasicHttpBinding();
            //根据 WebService 的 URL 构建终端点对象,参数是提供的WebService地址
            var endpoint = new EndpointAddress(@"http://192.168.1.5/Service1.asmx");
            //创建调用接口的工厂,注意这里泛型只能传入接口 泛型接口里面的参数是WebService里面定义的类名+Soap
            var factory = new ChannelFactory<Service1Soap>(binding, endpoint);
            //从工厂获取具体的调用实例
            var callClient = factory.CreateChannel();
            /*          //调用具体的方法,这里是 HelloWorldAsync 方法
                      Task<HelloWorldResponse> responseTask = callClient.HelloWorldAsync(new HelloWorldRequest());
                      //获取结果
                      HelloWorldResponse response = responseTask.Result;
                      // 获取HelloWorld方法的返回值
                      string result1 = response.Body.HelloWorldResult;*/

            // 调用TestMethod方法,不传递参数
            string userid = "";
            Task<CheckUserResponse> testResponse = callClient.callAsync(new CheckUserRequest(username, password, userid, 0));

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

思路:成员对象的innerXml

image.png

刚开始采用如下方法

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

提示错误 System.InvalidOperationException:“DataTable does not support schema inference from Xml.”
解决方法是需要填写写入 xmlschema,但是这个东西没有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 是根据 innerxml里面的节点得知,
innerxml大概数据集如下:

  <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>你号aaaa</app_desc>
    </DT_Webservice>
</DocumentElement>

当然我认为还有一个思路就是直接研究System.XML.element 类的用法直接递归
System.XML.element本身也属于 XmlNode
每个xmlnode都包好childNodes 也就是XmlNodeList 可以直接用下标访问

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

                       String currentText=current.InnerText;
}}

关于 selectNodes语法参考


注意这里AddNamespace方法的前面一个参数用于标记这个命名空间,在下面SelectNodes方法中加上对应的标记。给出的这一段是为了查找数据库连接字符串的节点。顺便附带扯下SelectNodes中XPath的语法:

SelectNodes("node")          从当前子节点中查找节点

SelectNodes("/node")         从根节点的子节点中查找节点

SelectNodes("//node")        从任意位置上查找名为node的节点

SelectNodes(".")                 选择当前节点

SelectNodes("..")                选择当前节点父节点

SelectNodes("//node[1]")    选择名为node的第一个节点,注意这里是从1开始,不是从0开始

SelectNodes("/@name")    选择有name属性的节点

SelectNodes("/node[position() < 3]")           选择名为node的前两个节点

SelectNodes("//node[@name]")                  选择node节点,并且该节点有name属性

SelectNodes("//node[@name='limit']")        选择node节点,并且该节点有name属性,而且name属性值为limit

SelectNodes("//node[contains(item)]")        选择node节点,该节点存在名字item的子节点,注意,如果有命名空间,这里要加命名空间,XX:item

SelectNodes("//node[contains(item,‘Hello World’)]")        选择node节点,该节点存在名字item的子节点,并且item节点内容为Hello World

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

除此之外 ,调用webservice采用http访问
假设为

WebService 引用这个http://192.1.1/A.asmx
方法名为checkUser
文档如下

image.png

那么应该是这样的访问
http://192.168.1.1/A.asmx/CheckUser?sUser=1&sPwd=1&ssuserid=1&ssAllow=0

关于xml返回的 文档 可以看到相关定义,这里方别为请求 和返回。


image.png

可以看到 为xmlxml。

最后还有一种方式最麻烦的调用,就是安卓这边要调用 则找到soap 插件库,调用这么个落后的东西搞那么多麻烦事情。

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

发现asmx里面有直接测试的,抓包后用sh调用


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是参数1
FunctionName是参数名
get访问
```http://127.0.0.1:8088/WebService1.asmx?op=函数名``
可以直接进入测试页,实际上 里面的测试 上面的是post请求
也就是说post,get都可以访问

get是
http://127.0.0.1:8088/WebService1.asmx/函数名?参数名=参数值
而post是
http://127.0.0.1:8088/WebService1.asmx/函数名
参数就是正常的表单传递了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容