谁说.net core不好动态访问webservice?看这篇文章,C#快速实现动态访问webservice,兼容.net framework和.net core+

news/2024/10/6 18:28:35
前言:访问webservice,大多数人都是用服务引用的方式,但是这种方式比较麻烦,例如遇到服务更新了,你还需要手动更新你的服务引用,再重新发布,很麻烦。或者已有的一些例子,至少我看到的很多案例,动态访问也只能止步于使用.net framework环境,没看到有啥.net core上面动态访问的案例。于是我就来抛砖引玉一下,自己写一个支持.net framework也可以支持.netcore或以上环境使用的动态访问webservice服务接口的方法,供大家使用或参考。
 
先创建一个webservice服务,用来测试使用。提供三个服务接口,一个无参数、一个字符串参数、一个含有多个实体类参数(实体类参数也含有嵌套和集合)以及返回带有嵌套和集合的返回数据,用来做测试使用,基本上可以涵盖几乎所有的webservice服务的情况了。
0
有关测试实体类
0
启动webservice服务备用
0
 
请求端程序,支持.netframework 4.6.1+、.net core+和.net 5+所有版本,都可以通过nuget来引用 Wesky.Net.OpenTools 包。需要引用最新的版本,以保证功能完善。我此处使用.net 8的控制台来引用,大佬们可以根据自己程序情况进行引用,framework4.6以下版本不适用。
0
为了方便使用,我本地也直接编写几个实体类,用来传参和做返回值接收使用:
0
先实例化一个WebserviceHelper对象,如果有用IOC容器的大佬,比如说使用asp.net core程序等,可以对该接口和类进行依赖注入的注册。如果没用IOC容器的大佬,可以直接这样new一个使用。此处我用new一个对象的使用方式来使用。并且获取到asmx的url地址,地址此处需要添加?wsdl后缀。
0
申明要访问的服务的名称,例如HelloWorld,然后直接调用。由于没有参数,所以参数直接设为null
0
运行程序进行调用,可以看到获取到了返回值的xml文档。
0
直接调用的时候,返回值是一个 OpenToolResult类型,类型定义如下:
0
由于咱们的返回值就一个基础类型string,所以需要调用解析基础类型值的方法,得到最终的返回消息为 Hello World。
0
基础类型值解析方法定义如下:
0
传入参数为:获取到的返回值、节点名称(一般是方法名称+“Result”)、命名空间,命名空间在调用的时候,会被存储到类型OpenWebserviceInfo的属性OpenWebservice集合(是一个OpenWebserviceDocCache类型的集合)里面去,通过url地址和接口方法名字可以匹配到对应的命名空间。
OpenWebserviceDocCache类型定义如下:
0
 
接着试一下传入一个基础类型参数的情况。访问Hola方法,传入Wesky字符串,成功获取到返回值 Wesky World。
0
 
接下来试一下传入多个实体类参数,并且按照上面webservice的内容,会返回一个其他一个实体类消息。
0
回看一下TestService服务接口的实现,说明动态访问是成功的。
0
访问webservice方法定义说明。参数可以传0个或多个参数,会用来和解析度wsdl地址的同名方法服务参数个数做匹配,如果不匹配,则会提示错误信息。返回值Result.IsSuccess如果是true,代表发送请求成功;如果解析错误或者发送请求失败等,则提示false,并且Message属性会有具体错误信息描述。
0
返回值为实体类的解析方法定义说明。以上请求TestSevice服务接口时候,返回值是实体类,如果需要匹配本地的实体类,需要访问 ExtractCustomerValueFromXml方法进行解析处理。例如上面传入的是ResultInfo类型作为返回值接收类。
0
一些核心代码:
  /// <summary>/// 调用Web服务/// Calls a web service./// </summary>/// <param name="url">服务URL / Service URL</param>/// <param name="apiName">API名称 / API name</param>/// <param name="expireSecond">过期时间(秒)/ Expiration time in seconds</param>/// <param name="parameters">调用参数 / Invocation parameters</param>/// <returns>调用结果 / Invocation result</returns>public OpenToolResult<string> CallWebservice(string url, string apiName,long expireSecond = 86400,params object[] parameters){OpenToolResult<string> result = new HttpExtensions.OpenToolResult<string>();CheckExpireTime(url, apiName, expireSecond);var wsInfo = OpenWebserviceInfo.OpenWebservice.FirstOrDefault(x => x.WebserviceUrl == url && x.OperationName == apiName);if (wsInfo == null){result.IsSuccess = false;result.Message = "本地无法加载远程webservice服务。Cannot load the remote webservice locally.";return result;}if ((parameters == null && wsInfo.ParameterNames.Count > 0) || (parameters!=null && parameters.Length != wsInfo.ParameterNames.Count)){result.IsSuccess = false;result.Message = $"远程服务接口参数个数和你传入的参数个数不匹配。远程服务参数个数:{wsInfo.ParameterNames.Count}, 本地传入参数个数: {parameters?.Length ?? 0}。Parameter count mismatch: remote service has {wsInfo.ParameterNames.Count}, provided {parameters?.Length ?? 0}.";return result;}Dictionary<string, string> dicParams = new Dictionary<string, string>();if (parameters != null){for (int i = 0; i < wsInfo.ParameterNames.Count; i++){dicParams.Add(wsInfo.ParameterNames[i], XmlConvertor.SerializeObjectToXml(parameters[i]));}}var response = InvokeService(url, apiName, dicParams,wsInfo.Namespace);result.Result = response;result.IsSuccess = true;result.Message = "success";return result;}

 

如果以上内容对你有帮助,欢迎点赞、转发、在看和关注我的个人公众号:【Dotnet Dancer】
 
如果需要以上演示代码和webservice测试源码,可以在公众号【Dotnet Dancer】后台回复“动态接口”进行下载。
 
OpenTools系列文章快捷链接【新版本完全兼容旧版本,不需要更新任何代码均可使用】:
1.0.11版本
如何一行C#代码实现解析类型的Summary注释(可用于数据字典快速生成)
https://mp.weixin.qq.com/s/CWqubRRMoYVQIQJSyjIUXg
1.0.10版本:
C#/.NET一行代码把实体类类型转换为Json数据字符串
https://mp.weixin.qq.com/s/nVcURD0lf5-AQOVzwHqcxw
1.0.8版本:
上位机和工控必备!用.NET快速搞定Modbus通信的方法
https://mp.weixin.qq.com/s/Yq6kuXzFglHfNUqrHcQO9w
1.0.7版本:
大揭秘!.Net如何在5分钟内快速实现物联网扫码器通用扫码功能?
https://mp.weixin.qq.com/s/-5VuLAS6HlElgDQXRY9-BQ
1.0.6版本:
.NET实现获取NTP服务器时间并同步(附带Windows系统启用NTP服务功能)
https://mp.weixin.qq.com/s/vMW0vYC-D9z0Dp6HFSBqyg
1.0.5版本:
C#使用P/Invoke来实现注册表的增删改查功能
https://mp.weixin.qq.com/s/LpsjBhDDzkwyLU_tIpF-lg
1.0.3版本:
C#实现图片转Base64字符串,以及base64字符串在Markdown文件内复原的演示
https://mp.weixin.qq.com/s/n9VtTCIiVUbHJk7OfoCcvA
1.0.2版本:
​C#实现Ping远程主机功能(支持IP和域名)
https://mp.weixin.qq.com/s/d-2HcIM1KaLo-FrrTLkwEw
1.0.1版本:
开始开源项目OpenTools的创作(第一个功能:AES加密解密)
https://mp.weixin.qq.com/s/78TA-mst459AuvAHwQViqQ
 
【备注】包版本完全开源,并且没有任何第三方依赖。使用.net framework 4.6+、任意其他跨平台.net版本环境,均可直接引用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/42963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

DP(一)

前言 习题博客:link。 因为各种原因,这个博客是赶出来的,所以大概率会有没讲清楚或者讲错了的情况,请大家及时指出。 因为个人不是非常擅长于 DP,可能很难判别一道题的好坏,所以可能存在几道史题在题单中,请大家谅解。 这篇博客理论上仅限于讲解例题,大部分习题的题解请…

DP 习题(一)

朴素 DP [ABC301F] Anti-DDoS 题意 link 定义形如 DDoS 的序列为类 DDoS 序列,其中 DD 表示两个相同的任意大写字母,o 表示任意小写字母,S 表示任意大写字母。 给定一个由大小写字母和 ? 组成的序列 \(S\),问有多少种将 ? 替换为大小写字母的方案可以使 \(S\) 不含有任何…

动漫漫画音乐小说 免费

阅读3.x:https://github.com/gedoor/legado1:猫趣漫画 漫画在前面 笔记 中已经提到了,这里就不在叙述。 2:阅读小说 2.1:罗里吧嗦阅读APP 嘎嘎好用,这款阅读器是开源的,也是我第一次接触 小说 类的APP, 我对小说没有过分追求,如果只是为了看小说,咱就直接用番茄小说了…

深度学习环境安装-conda-torch-Jupyter Notebook

conda的安装 为什么要安装这个,它是什么? 它是一个管理环境的,当我们跑项目的时候,往往这些项目所需要的pickets库和环境是不同的,这时候如果自己的电脑里面只有一个版本的库的话,就运行不了,比如,A项目需要python3.7,那你只有3.8就不方便,所以就有了conda来管理这些…

Eurocrypt 2024 s Accepted Papers

转载自: https://eurocrypt.iacr.org/2024/acceptedpapers.phpAccepted Papers 已接受的论文These papers are listed in order of submission.这些论文按提交顺序排列。Twinkle: Threshold Signatures from DDH with Full Adaptive Security闪烁:具有完全自适应安全性的DDH…

关于Docker加速镜像

真的被公开的加速镜像坑惨 https://hub-mirror.c.163.com/ https://mirror.baidubce.com/ https://docker.mirrors.ustc.edu.cn/ 3家都加进去了,折腾半个多小时pull还是慢的要命,国内这尿性不用信了。 阿里云的docker镜像加速地址每个用户不一样,滥用的可能性少,而且官方…

【esp32 项目】使用I2C第一篇——I2C的科普

https://www.eepw.com.cn/zhuanlan/315431.html天我们来玩儿I2C。 I2C概述 I2C全称是Inter-Integrated Circuit,是飞利浦半导体公司(06年迁移到NXP了)在1982年发明的,是使用非常广泛的一种通信协议,很多传感器、存储芯片、OLED等,都是在使用I2C。标准输出模式下能达到100…

第一篇 LeetCode(42)接雨水

LeetCode(42)接雨水 力扣官网 题目描述:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以…