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

c# .***6 指定wsdl, 调用该接口服务。

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

功能

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

实现方式1

  • 使用BasicHttpBinding

通过WSDL文件,生成WEB服务

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

  1. 首先,在 VS2022 中打开 .*** 6 项目或者新建一个 .*** 6 项目。

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

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

    • OpenAPI
    • gRPC
    • WCF Web Service

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

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

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

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

  7. 还有一个生成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<string> 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 =
                    @"<?xml version=""1.0""?>  
                        <soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">  
                            <soap:Body>  
                            <invoke xmlns=""http://xxxxx.yyyyyyyy.***"">  
                                <xmlData>" + mParam +
                           @"</xmlData>  
                            </invoke>  
                            </soap:Body>  
                        </soap:Envelope>";

                // 发送 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格式。

<?xml version=""1.0"" encoding=""UTF-8""?>
<Request>
    <Name>
        QueryUsers
    </Name>
    <Info>
        <ID>21202012211211</ID>
    </Info>
</Request>

完结

  • 经过简单试验,感觉方式2的性能要略优于方式1的实现。我目前次采用的也是方式2。
转载请说明出处内容投诉
CSS教程_站长资源网 » C# .Net6 指定WSDL, 生成Webservice,调用该接口服务

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买