简书链接:aspnetcoreapi等调用webservice以及处理返回值踩坑之路 文章字数:1511,阅读全文大约需要6分钟
首先添加引用然他自动生成文件 点击go services 填写如http://192.168.1.5/Service1.asmx 里面会加载出来记住名字 如Service1Soap 将自动生成 下一步 默认 ,完成 然后定位项目文件夹
查看命名空间 并引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 //创建 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.Elementhttps://docs.microsoft.com/zh-cn/dotnet/api/system.xml.xmlelement?view=net-6.0
思路:成员对象的innerXml
刚开始采用如下方法
1 2 3 4 5 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样板。 改成如下即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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大概数据集如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <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 可以直接用下标访问
1 2 3 4 5 6 7 8 9 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语法参考
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 注意这里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 文档如下 那么应该是这样的访问http://192.168.1.1/A.asmx/CheckUser?sUser=1&sPwd=1&ssuserid=1&ssAllow=0
关于xml返回的 文档 可以看到相关定义,这里方别为请求 和返回。
可以看到 为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