C# .Net6 指定WSDL, 生成Webservice,调用该接口服务

2024-03-15 1626阅读

温馨提示:这篇文章已超过419天没有更新,请注意相关的内容是否还可用!

C# .Net6 指定WSDL, 调用该接口服务。

  • IDE: Microsoft Visual Studio Community 2022 (64 位)
  • 平台:.Net6
  • 协议:Soap协议 Xml格式

    功能

    • 需要开发一个前置机程序, 用于和硬件程序交互,
    • 已知条件是:嵌入式同事提供另一个约定好的*.wsdl文件作为双方通信的Webservice接口协议,对方是服务端,前置机是客户端

      实现方式1

      • 使用BasicHttpBinding

        通过WSDL文件,生成WEB服务

        注意,这里,我的VS2022的提示步骤和网上查到的操作步骤略有不同,下面的步骤是我的VS2022的操作步骤:

        C# .Net6 指定WSDL, 生成Webservice,调用该接口服务
        (图片来源网络,侵删)
        1. 首先,在 VS2022 中打开 .NET 6 项目或者新建一个 .NET 6 项目。

        2. 在“解决方案资源管理器”中,右键单击项目名称,然后选择“添加”->“服务引用”。

        3. 在“添加服务引用”窗口中,有三个选项,

          • OpenAPI,
          • gRPC
          • WCF Web Service

            这里选择 WCF Web Service,进入窗口“添加新的WCF Web Service服务引用”

          • 点击“浏览”按钮,然后从文件系统中选择你的 WSDL 文件。

          • 选中 WSDL 文件后,服务引用的配置将在窗口下方显示出来。这里可以在下面的输入框,修改命名空间为你想要的名称,点击下一步,在新窗口中,可以指定数据类型选项,默认不需要改,点击“完成”。

          • 此时,VS2022 会根据你的 WSDL 文件生成 Web 服务的代码,即:原Webservice服务的代理类。

          • 还有一个生成Webservice服务代理类的方法:

            • 用wsdl.exe工具的方式
            • 指令是:wsdl /language:c# /n:Fu /out:d:/MyService.cs C:\Users\Administrator\Desktop\MyService.wsdl)
              • “d:/MyService.cs”是输出目录
              • “C:\Users\Administrator\Desktop\MyService.wsdl”是源wsdl文件的位置
              • 具体用法,可以使用搜索引擎查询,这里不再赘述。
        调用该WebService的方法
        		public static async Task TestCallWs()  
                {
                    mydemo.TestMyClient serv = null;
                    try
                    {
                        var binding = new BasicHttpBinding();
                        var endpoint = new EndpointAddress(UrlString); // url地址
                        serv = new mydemo.TestMyClient(binding, endpoint);
                        var result = await serv.invokeAsync(ParamsString); // xml格式的字符串参数
                        Console.WriteLine("返回接口数据:\n " + result);
                        
                    }
                    catch(HttpRequestException e)
                    {
                        Console.WriteLine(e.Message);
                    }
                    finally
                    {
                        if (serv != null) 
                        {
                            serv.Close();
                        }
                    }
                }
        

        实现方式2

        使用HttpClient

        简单做一下封装

        - 定义:WsClient
        
        	public class WsClient
            {
                // 接口地址
                private string mUrl = string.Empty;
                // 请求参数
                private string mParam = string.Empty;
                 namespace命名空间
                //private string ns = "http://XXX:xx/xx/xx"; // TODO填写上你需要的命名空间名称
                
                 请求方法名
                //private string funName = string.Empty;
                public WsClient() 
                { 
                    throw new NotImplementedException();
                }
                public WsClient(string url)
                {
                    this.mUrl = url;
                }
                public async Task Request(string param)
                {
                    if (string.IsNullOrEmpty(mUrl))
                    {
                        return "接口地址为空!";
                    }
                    if (!mUrl.Contains("http"))
                    {
                        return "非法接口地址!";
                    }
                    if (string.IsNullOrEmpty(param))
                    {
                        return "请求参数为空!";
                    }
                    this.mParam = param;
                    try
                    {
                        HttpClient httpClient = new();
                        // soap参数
                        string payload =
                            @"  
                                  
                                      
                                      
                                        " + mParam +
                                   @"  
                                      
                                      
                                ";
                        // 发送 SOAP 请求并获取响应  
                        HttpResponseMessage response = await httpClient.PostAsync(mUrl, new StringContent(payload, Encoding.UTF8, "text/xml"));
                        // 解析 SOAP 响应  
                        string respStr = await response.Content.ReadAsStringAsync();
                        return respStr;
                    }
                    catch (HttpRequestException e)
                    {
                        Console.WriteLine("WsClient -> Request()异常 : {0} ", e.Message);
                    }
                    return "";
                }
            }
        

        调用方式:

        string result = await new WsClient(wsUrl).Request(xmlData);
        

        wsUrl: 是你的Webservice接口地址;

        xmlData: 是你拼装好协议里约定的xml格式的数据参数,示例如下:

        result: 是请求接口,返回的数据,也是xml格式。

        
            
                QueryUsers
            
            
                21202012211211
            
        
        

        完结

        • 经过简单试验,感觉方式2的性能要略优于方式1的实现。我目前次采用的也是方式2。
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]