You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中获取WSDL元素详情并展示到ListBox

在C#中解析WSDL并展示到ListBox的实现方案

步骤1:添加必要的引用与命名空间

首先在项目中添加System.Web.Services引用(右键项目 → 管理NuGet程序包或直接在引用列表中找到添加),然后在代码文件顶部引入以下命名空间:

using System;
using System.Web.Services.Description;
using System.Xml;
using System.Text;
using System.Windows.Forms;

步骤2:编写WSDL解析与ListBox填充逻辑

以WinForms为例,假设你有一个ListBox(命名为listBox1)和一个触发解析的按钮,在按钮点击事件中实现以下逻辑:

private void btnParseWSDL_Click(object sender, EventArgs e)
{
    listBox1.Items.Clear();
    // 替换为你的WSDL地址或本地文件路径
    string wsdlSource = "http://example.com/your-service?wsdl";

    try
    {
        // 加载WSDL文档
        ServiceDescription serviceDesc = ServiceDescription.Load(wsdlSource);

        // 遍历所有服务节点
        foreach (Service service in serviceDesc.Services)
        {
            // 遍历服务下的每个端口(端点)
            foreach (Port port in service.Ports)
            {
                string requestAddress = port.Address.ToString();
                Binding binding = serviceDesc.Bindings[port.Binding.Name];

                // 遍历当前绑定下的所有操作
                foreach (Operation operation in binding.Operations)
                {
                    StringBuilder infoBuilder = new StringBuilder();
                    // 拼接操作基本信息
                    infoBuilder.AppendLine($"*操作名称*: {operation.Name}");
                    infoBuilder.AppendLine($"*请求地址*: {requestAddress}");

                    // 解析请求参数
                    Message inputMessage = serviceDesc.Messages[operation.Input.Message.Name];
                    infoBuilder.AppendLine("*请求参数*:");
                    foreach (MessagePart part in inputMessage.Parts)
                    {
                        // 区分复杂类型(Element)和简单类型(Type)
                        string typeName = part.Element != null ? part.Element.Name : part.Type.Name;
                        infoBuilder.AppendLine($"- {part.Name}: {typeName}");
                    }

                    // 解析响应参数(如果存在)
                    if (operation.Output != null)
                    {
                        Message outputMessage = serviceDesc.Messages[operation.Output.Message.Name];
                        infoBuilder.AppendLine("*响应参数*:");
                        foreach (MessagePart part in outputMessage.Parts)
                        {
                            string typeName = part.Element != null ? part.Element.Name : part.Type.Name;
                            infoBuilder.AppendLine($"- {part.Name}: {typeName}");
                        }
                    }

                    // 添加分割线区分不同操作
                    infoBuilder.AppendLine("------------------------------");
                    listBox1.Items.Add(infoBuilder.ToString());
                }
            }
        }
    }
    catch (Exception ex)
    {
        listBox1.Items.Add($"解析出错: {ex.Message}");
    }
}

关键逻辑说明

  • ServiceDescription.Load(): 直接加载远程URL或本地路径的WSDL文档,自动解析服务结构
  • port.Address: 获取当前端点的实际请求地址(SOAP endpoint)
  • binding.Operations: 提取当前绑定下的所有接口操作
  • Message.Parts: 对应操作的请求/响应参数,通过Element或Type区分复杂类型与简单类型

注意事项

  • 如果WSDL需要身份验证,你需要提前配置WebClient或修改ServiceDescription.Load的加载方式,添加凭据信息
  • 部分复杂WSDL可能包含扩展类型,如需深入解析类型结构,可以进一步遍历serviceDesc.Types.Schemas获取XML Schema定义

内容的提问来源于stack exchange,提问作者SAHashemi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:31:16