C#获取WebService接口的所有可调用方法[WebMethod]
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]相关推荐
- 【WebService笔记01】使用JWS实现WebService接口的发布和调用
这篇文章,主要介绍如何使用JWS实现WebService接口的发布和调用. 目录 一.JWS实现WebService接口 1.1.JWS发布WebService接口 (1)编写接口 (2)编写实现类 ...
- 金蝶 EAS WebService 启动安全性后的调用方法
金蝶EAS WebService开启安全性后,调用方法代码 首先登录获取 SessionID public static String login() throws ServiceException, ...
- Webservice接口的生成及调用
最近项目上要对接一个Webservice形式的接口,因为以前一直没有对接过这种类型的,所以这次专门查了一些资料学习下 一.Webservice的简单介绍 WebService是一种跨编程语言和跨操作系 ...
- WebService接口登录验证代码生成调用
1.参考使用CXF生成WebService接口调用代码_时光下的旅途-CSDN博客生成调用代码 注意:前端登录后,保存为XML文件,根据XML生成接口调用代码 2.调用接口时,设置账号密码(使用jdk ...
- JAVA抽象类实例化对象实现接口的三种调用方法
在笔者的学习过程中抽象类实例化对象实现接口,笔者发现了三种表示方法.第一种是要实例化接口和抽象类,再用实例化的对象调用重写的的方法,这比较繁琐:第二种是直接实例化抽象类,将抽象类进行强转成对象,因为对 ...
- Java调用.net开发的webService接口
若一个webservice接口是以.asmx格式来结尾的话,则表明该接口是.net开发的接口 例如:http://www.webxml.com.cn/WebServices/TranslatorWeb ...
- 基于CXF框架的webservice接口发布与调用
目录 前言 正文 一,开发接口服务端(soap风格),接收SAP系统推送过来的数据 二,调用SAP提供的webservice接口(soap风格) 三,调用SRM系统提供的rest接口 四,接口调试工具 ...
- SoapUI调用webservice接口,http+post方式模仿soapui调用webservice接口
` SoapUI调用webservice接口,http+post方式模仿soapui调用webservice接口 项目上调用一个第三方公司提的的webservice短信接口,使用了以下几种接口调用技术 ...
- webService接口对接医院lis系统接口
文章目录 1.应用场景 2.http协议简述 3.webService协议/soup简述 4.发送webService请求 4.1建立HttpUtils工具类,来发送post请求 4.2 调用医院给的 ...
最新文章
- SAP提请法院向甲骨文支付不超4亿美元赔偿金
- LeetCode Construct Binary Tree from Inorder and Postorder Traversal
- Java 读取 .properties 配置文件的几种方式
- DreamWeaver做ASP 服务器配置篇
- 2018江苏冬令营5 交换矩阵
- 转发 微博 Qzone 微信 基础知识|存储相关的名词
- 修改MySQL的默认数据存储引擎
- 三层交换及DHCP中继配置
- matlab interp2插值函数的使用
- java中如何配置前端项目,将后端或前端项目部署到云服务器上
- win8系统用友U8服务器的设置,用友u8服务器参数配置
- 基因组测序中N50和N90到底指什么?
- 在用argparse的add_argument添加运行参数时,(bool类型)参数不生效
- 抖音API分析,视频批量下载-初级
- 让我们愉快的切割吧 - 4:如何在无特定间隔符下拆分字母和数字
- 2021年中国汽车产量、销量及汽车制造业发展趋势分析[图
- 多波次导弹发射中的规划问题(二)
- 腾讯离职元老的内部邮件:马化腾的趣事
- 问题 M: 【字符串】贝贝的数学课
- Http chunk介绍
热门文章
- Linux下的Telnet指令详解
- exchange邮件中继服务器搭建,Exchange 2003 SMTP服务器中继设置
- 女生适合学计算机应用技术,计算机应用技术专业 好就业吗?适合女生学吗?...
- exists的用法 python_sql-exists、not exists的用法
- VCF的开发环境搭建
- xss跳转代码_XSS(跨站脚本攻击)
- Jetson TX1 硬件配置概览
- Masonry的尝试_照片墙
- Elasticsearch中的Term查询和全文查询
- 软考_信息系统项目管理师_项目立项管理