当前位置: 首页 > news >正文

【超细完整版】C# WebService 通过URL生成WSDL文件和DLL文件 【生成篇】

先学生成,再看调用哦
【超细完整版】C# 获取WebService所有方法并调用 【调用篇】

目的

支持通过web url (自适应“?wsdl”的有无) 生成.wsdl文件 和 .dll文件

实现

将通过一个类的三部分来实现这些功能

  • 获取url中的ClassName (GetClassNameFromUrl)
  • 转换为WSDL文件 (UrlToWsdlFile)
  • 转换为DLL文件 (UrlToDllFile)

创建一个新类

类名为 WebServiceHelper.cs

    /// <summary>/// 动态调用WebService(支持SaopHeader)/// </summary>public class WebServiceHelper{}

并在该类实现下述方法

获取url中的ClassName

#region 获取url中的ClassName
/// <summary>   
/// 获取WebService的类名   
/// </summary>   
/// <param name="wsUrl">WebService地址</param>   
/// <returns>返回WebService的类名</returns>   
public static string GetClassNameFromUrl(string wsUrl)
{string result = string.Empty;if (!wsUrl.EndsWith("?wsdl", StringComparison.CurrentCultureIgnoreCase)){wsUrl = wsUrl + "?wsdl";}XmlDocument doc = new XmlDocument();doc.Load(wsUrl);try{result = doc.GetElementsByTagName("wsdl:service")[0].Attributes[0].Value;}catch (Exception err){return string.Empty;}return result;
}
#endregion

转换为WSDL文件

 #region 生成WSDLpublic static void UrlToWsdlFile(string url, string savePath, string outName = ""){string className = string.Empty;string FullFileName = string.Empty;className = GetClassNameFromUrl(url);if (outName == ""){outName = className + ".wsdl";}else{if (!outName.EndsWith(".wsdl", StringComparison.CurrentCultureIgnoreCase)){outName = outName + ".wsdl";}}if (!url.EndsWith("?wsdl", StringComparison.CurrentCultureIgnoreCase)){url = url + "?wsdl";}FullFileName = savePath + "\\" + outName;WebClient wc = new WebClient();if (!System.IO.Directory.Exists(savePath)){System.IO.Directory.CreateDirectory(savePath);//不存在就创建文件夹}wc.DownloadFile(url, FullFileName);}#endregion

转换为DLL文件

#region 生成DLLpublic static CompilerResults UrlToDllFile(string url, string @namespace = "")
{string className = string.Empty;className = GetClassNameFromUrl(url);if (!url.EndsWith("?wsdl", StringComparison.CurrentCultureIgnoreCase)){url = url + "?wsdl";}WebClient web = new WebClient();Stream stream = web.OpenRead(url);//创建和格式化 WSDL 文档。       ServiceDescription description = ServiceDescription.Read(stream);CompilerResults compiler = CreatDll(className, description, @namespace);return compiler;
}private static CompilerResults CreatDll(string className, ServiceDescription description, string @namespace = "")
{try{// 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();nmspace.Name = @namespace;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 + "dll\\" + 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);if (result.Errors.HasErrors){System.Text.StringBuilder sb = new System.Text.StringBuilder();foreach (System.CodeDom.Compiler.CompilerError ce in result.Errors){sb.Append(ce.ToString());sb.Append(System.Environment.NewLine);}throw new Exception(sb.ToString());}return result;}catch (Exception err){MessageBox.Show(err.Message, "Error");return null;}
}
#endregion

应用

个人示例,实际根据自己需求调整 ; 以下为窗体按钮事件

private void bt_generate_dll_Click(object sender, EventArgs e)
{try{WebServiceHelper.UrlToDllFile(tb_webLink.Text);if (MessageBox.Show("The dll is generated successfully. Do you want to open the file path?", "notice", MessageBoxButtons.YesNo) == DialogResult.Yes)openPath("dll");}catch (Exception err){MessageBox.Show(err.Message, "Error");}
}
private void openPath(string type)
{if (string.IsNullOrEmpty(type)) return;string key = string.Empty;key = type.Equals(defaultKey) ? wsdlPathKey : dllPathKey;//get Configuration objectConfiguration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);//get value by keystring path = config.AppSettings.Settings[key].Value;System.Diagnostics.Process.Start("explorer.exe", path);
}

老规矩,点赞关注走一波 😄

相关文章:

【超细完整版】C# WebService 通过URL生成WSDL文件和DLL文件 【生成篇】

先学生成&#xff0c;再看调用哦 【超细完整版】C# 获取WebService所有方法并调用 【调用篇】 目的 支持通过web url (自适应“?wsdl”的有无) 生成.wsdl文件 和 .dll文件 实现 将通过一个类的三部分来实现这些功能 获取url中的ClassName &#xff08;GetClassNameFromUrl&a…...

申请公派访问学者难不难?

申请公派访问学者&#xff0c;对许多人来说是一项具有挑战性的任务。这需要充分的准备和计划&#xff0c;以确保申请能够顺利进行并最终获得批准。下面将探讨一些关于申请公派访问学者的问题以及应对策略。 首先&#xff0c;申请公派访问学者需要有一个明确的研究计划或合作意向…...

关于汽车中网改装需要报备吗?(第二天)

车联网改造需要申报吗&#xff1f; 今天2022年10月20日&#xff0c;小编就给大家介绍一下车联网改装是否需要申报的相关知识。 让我们来看看。 汽车格栅改装无需申报。 这种年检可以直接通过。 您不必担心&#xff0c;因为汽车格栅对于实车的外观来说并不陌生&#xff0c;因此…...

面试官:对于 Java 中多态的理解是什么?

面试官&#xff1a;对于 Java 中多态的理解是什么&#xff1f; 题目 面试官&#xff1a;对于 Java 中多态的理解是什么&#xff1f; 推荐解析 1.父类的引用指向子类的对象 子类重写父类的方法&#xff1a;子类可以继承父类的方法&#xff0c;并对其进行重写。当通过父类的…...

JUC-1M/75±5°超小型密封温度继电器 体积小、重量轻、控温精度高 JOSEF约瑟

JUC系列温度继电器 JUC-1M型超小型密封温度继电器 JUC-2M型超小型密封温度继电器 继电器JUC-027M/2531H-III-G温度继电器 JUC-1M 10C常开温度继电器 JUC-1M 105C温度继电器 用途 小型温控开关系接触感应式密封温度继电器&#xff0c;具有体积小、重量轻、控温精度高等特点&…...

filebeat 配置

主要就是证书的配置 ca_trusted_fingerprint: 产生方式 openssl x509 -fingerprint -sha256 -in /etc/elasticsearch/certs/http_ca.crt 产生的结果 SHA256 Fingerprint 中的冒号 替换掉就是我们想要的结果 ssl: enabled: true ca_trusted_fingerprint: "…...

Qt教程 — 3.5 深入了解Qt 控件:Display Widgets部件(1)

目录 1 Display Widgets简介 2 如何使用Display Widgets部件 2.1 QLabel组件-显示图像或文本 2.2 QCalendarWidget组件-日历简单的使用 2.3 QLCDNumber组件-控件作时钟的显示 2.4 QProgressBar组件-模拟手机电池充电 2.5 QFrame组件-绘制水平/垂直线 Display Widgets将分…...

网络安全框架和云安全参考架构介绍

目录 一、网络安全框架 1.1 概述 1.2 IATF框架 1.2.1 框架来源 1.2.2 框架结构图 1.2.3 框架内容 1.2.3.1 人&#xff08;People&#xff09; 1.2.3.2 技术&#xff08;Technology&#xff09; 1.2.3.3 操作&#xff08;Operation&#xff09; 1.3 NIST网络安全框架 …...

360企业安全浏览器兼容模式显示异常某个内容不显示 偶发现象 本地无法复现情况js

360企业安全浏览器兼容模式显示异常 &#xff0c;现象测试环境频发 &#xff0c;本地连测试无法复现&#xff0c;线上反馈问题。 出现问题的电脑为windows且使用360企业安全浏览器打开兼容模式可复现 复现过程&#xff1a; 不直接点击超链接跳转页面 &#xff0c;登录后直接通…...

JVM常见启动参数

目录 内存参数设置 垃圾收集 内存溢出 其他杂项 总结 java虚拟机&#xff08;JVM&#xff09;的启动参数可以用来调整其行为、性能和资源分配。以下是一些常见的JVM启动参数&#xff1a; 内存参数设置 初始化堆内存以满足应用程序需求是最常见的与性能相关的实践之一。 …...

单元测试、集成测试、系统测试区别

一、测方法不同 1、单元测试属于白盒测试范畴。 2、集成测试属于灰盒测试范畴。 3、系统测试属于黑盒测试范畴。 二、考察范围不同 1、单元测试主要测试单元内部的数据结构、逻辑控制、异常处理等。exception handling 2、集成测试主要测试模块之间的接口和接ロ数据传递关…...

NIVision-相机图像采集

应用场景 上位机与工业相机通讯&#xff0c;控制相机抓取图像。 工业相机的通讯接口大多为USB口或网口。 USB口则直接将通讯线缆插入上位机USB端口&#xff0c;打开MAX中设备与接口一栏可以看到电脑给相机分配的资源名称&#xff1b;网口则需要将网线连接相机和上位机&#xf…...

【vue-小知识】var、let 和 const之间的区别

文章目录 结论1、重复定义变量名var&#xff1a;允许重复定义变量名let和const&#xff1a;不可以重复定义变量名 2、修改值var&#xff1a;允许修改值let&#xff1a;允许修改值const&#xff1a;不允许修改值&#xff0c;会报错 3、变量提升var : 支持变量提升let和const&…...

24.3 分布式综合应用

24.3 分布式综合应用 1. 分布式事务1.1 分布式事务1.2 分布式事务方案1. 2pc2. 其他方案1.3 Seata分布式事务框架:基于2pc1. 简介2. 启动seata服务1.4 微服务事务案例分析1. 代码分析2. 基于Seata改造2. 分布式锁2.1 简介1. redis实现...

Android学习进阶

UI组件进阶 使用RecyclerView和Adapter显示列表数据 RecyclerView是Android开发中用于显示列表数据的一个灵活且高效的组件。与其前身ListView相比&#xff0c;RecyclerView引入了更加复杂的布局排列和动画支持&#xff0c;使得创建高度定制化的列表和网格布局变得更加简单。…...

“低代码+平台”:驱动企业数字化转型与创新的新引擎

“低代码平台”作为一种新兴的软件开发范式&#xff0c;正逐渐成为企业快速响应市场变化、优化业务流程、提升数字化水平的重要手段。它的价值在于&#xff0c;将传统软件开发的复杂性大大降低&#xff0c;赋予了非技术人员或轻量级开发者快速构建应用的能力&#xff0c;并能灵…...

python代码截取任意页的pdf

python代码把截取任意页的pdf&#xff1a;比如你有一个pdf文件1.pdf&#xff0c;共有30页&#xff0c;但是&#xff0c;你想把其中的10-20页截取出来保存成新的pdf&#xff0c;名为2.pdf&#xff0c;可以使用下面代码 from PyPDF2 import PdfReader, PdfWriter# 输入和输出文件…...

速盾:cdn加速后真实ip会暴漏吗?

CND&#xff08;内容分发网络&#xff09;是一种通过将内容分发到全球各地的服务器来加速网站访问的技术。当用户请求访问一个网站时&#xff0c;CDN会将静态资源&#xff08;如图片、视频、脚本等&#xff09;缓存在离用户最近的服务器上&#xff0c;从而提高网站的加载速度。…...

ATA-5310前置微小信号放大器在红外线传感器中的应用

当涉及到红外线传感器时&#xff0c;前置微小信号放大器扮演着关键的角色。红外线传感器是一种用于探测和测量红外辐射的设备&#xff0c;它们通常用于热成像、物体检测、温度测量、动作检测等应用中。前置微小信号放大器在红外线传感器中的应用具有重要意义&#xff0c;下面将…...

【黑马程序员】Python多任务

文章目录 多进程多进程使用流程导入包Process进程类说明 获取进程编号目的常用操作 获取进程名进程注意点进程之间不共享全局变量主进程会等待子进程结束之后再结束设置守护主进程 多线程threading模块线程注意点线程之间执行是无序的主线程会等待所有的子线程执行结束在结束线…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...