C#获取指定的WebService接口的所有可调用方法,将其绑定的树图控件(TreeView)中,我们引用天气WebService服务为例,联网情况下均可用。

PS:天气WeatherWebService是一个WebService,而不是WCF。如果按照WCF调用,永远无法调用接口成功

一、新建Windows窗体应用程序WeatherWebServiceDemo

将默认的Form1重命名为FormWeather,窗体FormWeather设计如图

为树图控件tvAllMethods绑定事件AfterSelect

二、右键 引用---->添加服务引用

点击“高级” ---->添加Web引用,输入Url为

http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

点击转到

点击“添加引用”即可。

三、新建类文件SoapUtil.cs

SoapUtil源程序如下:

using System;
using System.Collections.Generic;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.IO;
using System.Net;
using System.Reflection;
using System.Web.Services.Description;
using System.Xml.Serialization;namespace WeatherWebServiceDemo
{/// <summary>/// 动态获取WebService的所有方法/// 斯内科 2022-06-08/// </summary>public class SoapUtil{/// <summary>/// 获取WebService接口的所有WebMethod方法/// 通过WebService方法的特性为【System.Web.Services.Protocols.SoapDocumentMethodAttribute】/// 根据特性SoapDocumentMethodAttribute来筛选出所有WebMethod方法/// </summary>/// <param name="url"></param>public static List<MethodInfo> GetAllWebMethodsFromService(string url, out string className){className = "SoapWebService";if (!url.EndsWith("?wsdl", StringComparison.CurrentCultureIgnoreCase)){url = url + "?wsdl";}string tempUrl = url;if (url.EndsWith("?wsdl", StringComparison.CurrentCultureIgnoreCase)){tempUrl = url.Substring(0, url.Length - 5);}className = Path.GetFileNameWithoutExtension(tempUrl);// 1. 使用 WebClient 下载 WSDL 信息。WebClient web = new WebClient();Stream stream = web.OpenRead(url);// 2. 创建和格式化 WSDL 文档。ServiceDescription description = ServiceDescription.Read(stream);// 3. 创建客户端代理代理类。ServiceDescriptionImporter importer = new ServiceDescriptionImporter();// 指定访问协议。importer.ProtocolName = "Soap";// 生成客户端代理。importer.Style = ServiceDescriptionImportStyle.Client;importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;// 添加 WSDL 文档。importer.AddServiceDescription(description, null, null);// 4. 使用 CodeDom 编译客户端代理类。// 为代理类添加命名空间,缺省为全局空间。CodeNamespace nmspace = new CodeNamespace();CodeCompileUnit unit = new CodeCompileUnit();unit.Namespaces.Add(nmspace);ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");CompilerParameters parameter = new CompilerParameters();parameter.GenerateExecutable = false;parameter.GenerateInMemory = true;//在内存中生成输出// 可以指定你所需的任何文件名。parameter.OutputAssembly = AppDomain.CurrentDomain.BaseDirectory + className + ".dll";parameter.ReferencedAssemblies.Add("System.dll");parameter.ReferencedAssemblies.Add("System.XML.dll");parameter.ReferencedAssemblies.Add("System.Web.Services.dll");parameter.ReferencedAssemblies.Add("System.Data.dll");// 生成dll文件,并会把WebService信息写入到dll里面CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);Assembly assembly = result.CompiledAssembly;Type type = assembly.GetType(className);List<MethodInfo> methodInfoList = new List<MethodInfo>();MethodInfo[] methodInfos = type.GetMethods();for (int i = 0; i < methodInfos.Length; i++){MethodInfo methodInfo = methodInfos[i];//WebMethod方法的特性为:System.Web.Services.Protocols.SoapDocumentMethodAttribute Attribute attribute = methodInfo.GetCustomAttribute(typeof(System.Web.Services.Protocols.SoapDocumentMethodAttribute));if (methodInfo.MemberType == MemberTypes.Method && attribute != null){methodInfoList.Add(methodInfo);}}return methodInfoList;}}
}

四、窗体FormWeather的主要程序如下:

(忽略设计器自动生成的部分类代码)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WeatherWebServiceDemo
{public partial class FormWeather : Form{public FormWeather(){InitializeComponent();}private void btnGetWebMethod_Click(object sender, EventArgs e){tvAllMethods.Nodes.Clear();string url = txtUrl.Text.Trim();string className;try{List<MethodInfo> methodInfos = SoapUtil.GetAllWebMethodsFromService(url, out className);TreeNode rootNode = new TreeNode("服务名:" + className);//以类名作为根节点tvAllMethods.Nodes.Add(rootNode);for (int i = 0; i < methodInfos.Count; i++){MethodInfo methodInfo = methodInfos[i];TreeNode treeNode = new TreeNode($"{methodInfo.Name}");//设置Tag标签为方法信息treeNode.Tag = methodInfo;rootNode.Nodes.Add(treeNode);                    }tvAllMethods.ExpandAll();}catch (Exception ex) {MessageBox.Show(ex.Message, "出错");}}private void tvAllMethods_AfterSelect(object sender, TreeViewEventArgs e){rtxtMethodInfo.Clear();if (e.Node.Level == 0){//不考虑根节点:服务类名return;}MethodInfo methodInfo = e.Node.Tag as MethodInfo;if (methodInfo == null){return;}ParameterInfo[] parameterInfos = methodInfo.GetParameters();rtxtMethodInfo.AppendText($"{methodInfo.ToString()}\n");rtxtMethodInfo.AppendText($"接口方法名:【{methodInfo.Name}】\n");rtxtMethodInfo.AppendText($"接口返回类型:【{methodInfo.ReturnType}】\n");rtxtMethodInfo.AppendText($"接口参数个数:【{parameterInfos.Length}】\n");for (int i = 0; i < parameterInfos.Length; i++){rtxtMethodInfo.AppendText($"  --->参数【{i + 1}】:【{parameterInfos[i].ToString()}】\n");}rtxtMethodInfo.AppendText($"接口整体描述:\n{methodInfo.ReturnType} {methodInfo.Name}({string.Join(",", parameterInfos.Select(p => p.ToString()))})");}}
}

五、程序测试如图:

C#获取WebService接口的所有可调用方法[WebMethod]相关推荐

  1. 【WebService笔记01】使用JWS实现WebService接口的发布和调用

    这篇文章,主要介绍如何使用JWS实现WebService接口的发布和调用. 目录 一.JWS实现WebService接口 1.1.JWS发布WebService接口 (1)编写接口 (2)编写实现类 ...

  2. 金蝶 EAS WebService 启动安全性后的调用方法

    金蝶EAS WebService开启安全性后,调用方法代码 首先登录获取 SessionID public static String login() throws ServiceException, ...

  3. Webservice接口的生成及调用

    最近项目上要对接一个Webservice形式的接口,因为以前一直没有对接过这种类型的,所以这次专门查了一些资料学习下 一.Webservice的简单介绍 WebService是一种跨编程语言和跨操作系 ...

  4. WebService接口登录验证代码生成调用

    1.参考使用CXF生成WebService接口调用代码_时光下的旅途-CSDN博客生成调用代码 注意:前端登录后,保存为XML文件,根据XML生成接口调用代码 2.调用接口时,设置账号密码(使用jdk ...

  5. JAVA抽象类实例化对象实现接口的三种调用方法

    在笔者的学习过程中抽象类实例化对象实现接口,笔者发现了三种表示方法.第一种是要实例化接口和抽象类,再用实例化的对象调用重写的的方法,这比较繁琐:第二种是直接实例化抽象类,将抽象类进行强转成对象,因为对 ...

  6. Java调用.net开发的webService接口

    若一个webservice接口是以.asmx格式来结尾的话,则表明该接口是.net开发的接口 例如:http://www.webxml.com.cn/WebServices/TranslatorWeb ...

  7. 基于CXF框架的webservice接口发布与调用

    目录 前言 正文 一,开发接口服务端(soap风格),接收SAP系统推送过来的数据 二,调用SAP提供的webservice接口(soap风格) 三,调用SRM系统提供的rest接口 四,接口调试工具 ...

  8. SoapUI调用webservice接口,http+post方式模仿soapui调用webservice接口

    ` SoapUI调用webservice接口,http+post方式模仿soapui调用webservice接口 项目上调用一个第三方公司提的的webservice短信接口,使用了以下几种接口调用技术 ...

  9. webService接口对接医院lis系统接口

    文章目录 1.应用场景 2.http协议简述 3.webService协议/soup简述 4.发送webService请求 4.1建立HttpUtils工具类,来发送post请求 4.2 调用医院给的 ...

最新文章

  1. SAP提请法院向甲骨文支付不超4亿美元赔偿金
  2. LeetCode Construct Binary Tree from Inorder and Postorder Traversal
  3. Java 读取 .properties 配置文件的几种方式
  4. DreamWeaver做ASP 服务器配置篇
  5. 2018江苏冬令营5 交换矩阵
  6. 转发 微博 Qzone 微信 基础知识|存储相关的名词
  7. 修改MySQL的默认数据存储引擎
  8. 三层交换及DHCP中继配置
  9. matlab interp2插值函数的使用
  10. java中如何配置前端项目,将后端或前端项目部署到云服务器上
  11. win8系统用友U8服务器的设置,用友u8服务器参数配置
  12. 基因组测序中N50和N90到底指什么?
  13. 在用argparse的add_argument添加运行参数时,(bool类型)参数不生效
  14. 抖音API分析,视频批量下载-初级
  15. 让我们愉快的切割吧 - 4:如何在无特定间隔符下拆分字母和数字
  16. 2021年中国汽车产量、销量及汽车制造业发展趋势分析[图
  17. 多波次导弹发射中的规划问题(二)
  18. 腾讯离职元老的内部邮件:马化腾的趣事
  19. 问题 M: 【字符串】贝贝的数学课
  20. Http chunk介绍

热门文章

  1. Linux下的Telnet指令详解
  2. exchange邮件中继服务器搭建,Exchange 2003 SMTP服务器中继设置
  3. 女生适合学计算机应用技术,计算机应用技术专业 好就业吗?适合女生学吗?...
  4. exists的用法 python_sql-exists、not exists的用法
  5. VCF的开发环境搭建
  6. xss跳转代码_XSS(跨站脚本攻击)
  7. Jetson TX1 硬件配置概览
  8. Masonry的尝试_照片墙
  9. Elasticsearch中的Term查询和全文查询
  10. 软考_信息系统项目管理师_项目立项管理