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

net,core,webservice,framework · 浏览次数 : 0

小编点评

前言: 本文将介绍一种动态访问webservice服务接口的方法,支持.NET Framework和.NET Core及以上版本。传统的webservice服务引用方法较为繁琐,需要手动更新服务引用并重新发布。本文提供一种新的解决方案,以便更方便地访问webservice服务。 创建一个webservice服务用于测试: 首先,我们需要创建一个webservice服务,用来测试使用。这里提供三个服务接口:无参数、字符串参数和含有多个实体类参数的接口。实体类参数可以包含嵌套和集合。返回数据将包含嵌套和集合。 测试实体类启动webservice服务: 要运行webservice服务,请确保您的计算机上安装了相应的.NET框架。然后,通过nuget引用Wesky.Net.OpenTools包。这个包支持.NET Framework 4.6.1+、.NET Core和.NET 5+版本。 调用webservice服务接口: 使用OpenToolResult类型来调用webservice服务接口。传入参数包括服务URL、API名称(例如HelloWorld)、过期时间(可选,默认为86400秒)和可变数量的参数。如果参数匹配,请求将成功发出。返回值是一个OpenToolResult对象,包含请求的成功标记(IsSuccess)和一条消息。 核心代码展示: 以下是创建WebserviceHelper对象的示例代码,用于调用Web服务。 ```csharp public class WebserviceHelper { private readonly OpenToolResult _openToolResult; private OpenWebserviceInfo _webServiceInfo; public WebserviceHelper() { _openToolResult = new HttpExtensions.Open_tool_result(); _webServiceInfo = OpenWebserviceInfo.OpenWebservice.FirstOrDefault(x => x.WebserviceUrl == "http://localhost:8080/HelloWorld?wsdl" && x.OperationName == "HelloWorld"); } public OpenToolResult CallWebservice(string url, string apiName, long expireSecond = 86400, params object[] parameters) { _openToolResult.IsSuccess = true; _openToolResult.Message = "success"; _openToolResult.Result =.InvokeService(url, apiName, parameters, _webServiceInfo.Namespace); return _openToolResult; } private OpenToolResult InvokeService(string url, string apiName, Dictionary parameters, string namespacePath) { var request = new Invoker(url, apiName, namespacePath, parameters); return request.InvokeService(); } } ``` 使用示例: ```csharp class Program { static void Main(string[] args) { var helper = new WebserviceHelper(); var result = helper.CallWebservice("http://localhost:8080/HelloWorld?wsdl", "HelloWorld"); Console.WriteLine(result.IsSuccess ? "请求成功" : $"请求失败:{result.Message}"); } } ``` 请注意,此示例仅用于演示目的。实际应用程序中可能需要更多的错误处理和验证。希望此方法能对您有所帮助。

正文

前言:访问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注释(可用于数据字典快速生成)
1.0.10版本:
C#/.NET一行代码把实体类类型转换为Json数据字符串
1.0.8版本:
上位机和工控必备!用.NET快速搞定Modbus通信的方法
1.0.7版本:
大揭秘!.Net如何在5分钟内快速实现物联网扫码器通用扫码功能?
1.0.6版本:
.NET实现获取NTP服务器时间并同步(附带Windows系统启用NTP服务功能)
1.0.5版本:
C#使用P/Invoke来实现注册表的增删改查功能
1.0.3版本:
C#实现图片转Base64字符串,以及base64字符串在Markdown文件内复原的演示
1.0.2版本:
​C#实现Ping远程主机功能(支持IP和域名)
1.0.1版本:
开始开源项目OpenTools的创作(第一个功能:AES加密解密)
 
【备注】包版本完全开源,并且没有任何第三方依赖。使用.net framework 4.6+、任意其他跨平台.net版本环境,均可直接引用。

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

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

前言:访问webservice,大多数人都是用服务引用的方式,但是这种方式比较麻烦,例如遇到服务更新了,你还需要手动更新你的服务引用,再重新发布,很麻烦。或者已有的一些例子,至少我看到的很多案例,动态访问也只能止步于使用.net framework环境,没看到有啥.net core上面动态访问的案例

基于.NetCore开发博客项目 StarBlog - (27) 使用JWT保护接口

## 前言 这是StarBlog系列在2023年的第二篇更新😂 这几个月都在忙,更新变得很不勤快,但是拖着不更新我的心里更慌,很久没写,要开头就变得很难😑 说回正题,之前的文章里,我们已经把博客关键的接口都开发完成了,但还少了一个最关键的「认证授权」,少了这东西,网站就跟筛子一样,谁都可以来添加

记一次 .NET 某电力系统 内存暴涨分析

一:背景 1. 讲故事 前些天有位朋友找到我,说他生产上的程序有内存暴涨情况,让我帮忙看下怎么回事,最简单粗暴的方法就是让朋友在内存暴涨的时候抓一个dump下来,看一看大概就知道咋回事了。 二:Windbg 分析 1. 到底是谁吃了内存 这个问题说的再多也不为过,一定要看清楚这个程序是如何个性化发展

记一次 .NET某工厂报警监控设置 崩溃分析

一:背景 1. 讲故事 前些天有位朋友在微信上丢了一个崩溃的dump给我,让我帮忙看下为什么出现了崩溃,在 Windows 的事件查看器上显示的是经典的 访问违例 ,即 c0000005 错误码,不管怎么说有dump就可以上windbg开干了。 二:WinDbg 分析 1. 程序为谁崩溃了 在 Wi

谁说爬虫只能Python?看我用C#快速简单实现爬虫开发和演示!

前言:说到爬虫,基本上清一色的都知道用Python,但是对于一些没玩过或者不想玩Python的来说,却比较头大一点。所以以下我站在C# 的角度,来写一个简单的Demo,用来演示C# 实现的简单小爬虫。大家感兴趣可以自己拓展出更加丰富的爬虫功能。 前提:引用包HtmlAgilityPack 先来个爬取

[转帖]性能调优——小小的log大大的坑

https://segmentfault.com/a/1190000042434642 引言 “只有被线上服务问题毒打过的人才明白日志有多重要!”我先说结论,谁赞成,谁反对?如果你深有同感,那恭喜你是个社会人了:) 日志对程序的重要性不言而喻,轻巧、简单、无需费脑,程序代码中随处可见,帮助我们排查定

谁会拒绝一款开源的 3D 博客呢?

说到博客大家一定都不陌生,不管你是深耕职场多年的老鸟,还是在学校努力学习的小鸟,应该都有过一段“装扮”博客的经历,比如:放上喜欢的图片、添加炫酷的交互、换上 DIY 的博客主题等等。但不管再怎么“打扮”,也跳脱不出平面的“凡胎”。 今天 HelloGitHub 给大家带来的是一款开源的 3D 博客项

[转帖]NVMe-oF以太网SSD:三星说第一家,东芝/Marvell两年前就有了?

https://aijishu.com/a/1060000000238559 目录 -到底谁是第一款原生NVMe-oFSSD? -连接方案&性能测试 -从2019年拖到现在:还能引领存储系统潮流吗? -以太网SSD应用:不只是块设备? 在ODCC 2021开放数据中心峰会上,三星展出了Etherne

[转帖]看6大国产CPU加速替代,谁才是“王者”选手?

https://baijiahao.baidu.com/s?id=1761150458273739276&wfr=spider&for=pc 2023-03-23 17:33湖北匠心计划创作者,媒体人,优质科技领域创作者,内容评审官,活力创作者 关注 说到芯片,特别是底层硬件基础设施核心CPU中央处

能将三次握手讲到这个程度,不给你offer给谁!

摘要:在后端相关岗位的入职面试中,三次握手的出场频率非常的高,甚至说它是必考题也不为过。 本文分享自华为云社区《能将三次握手理解到这个深度,面试官拍案叫绝~》,作者:龙哥手记。 在后端相关岗位的入职面试中,三次握手的出场频率非常的高,甚至说它是必考题也不为过。一般的答案都是说客户端如何发起 SYN