C# 如何从C中的wsdl SOAP请求信封开始#

C# 如何从C中的wsdl SOAP请求信封开始#,c#,soap,wsdl,C#,Soap,Wsdl,我需要调用web服务上的操作,但我不知道请求信封是什么样子(这些服务在运行时由用户附加) 通常,我希望基于wsdl链接以编程方式生成soap信封。使用给定链接获取操作列表以及特定操作的结果: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:webservice.contentinn.com"> <soapenv:Header>

我需要调用web服务上的操作,但我不知道请求信封是什么样子(这些服务在运行时由用户附加)

通常,我希望基于wsdl链接以编程方式生成soap信封。使用给定链接获取操作列表以及特定操作的结果:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:webservice.contentinn.com">
    <soapenv:Header>
        <urn:AuthHeaderElement>
            <token></company>
        </urn:AuthHeaderElement>
    </soapenv:Header>
    <soapenv:Body>
      <urn:TestMethod>
         <id></id>
      </urn:TestMethod>
    </soapenv:Body>
</soapenv:Envelope>

有人知道怎么做吗

提出了两种方法:

  • :这不是一种真正的编程方法
  • :这听起来更接近你所需要的,但仍然不完全符合
  • 可能就是你想要的:

    DynamicProxy允许您通过指定服务的WSDL URI在运行时创建动态WCF客户端。DynamicProxy不依赖于预编译的代理或配置。DynamicProxy使用MetadataResolver从服务下载元数据,并使用WsdlImporter在运行时创建契约和绑定。编译的动态代理可用于使用反射调用服务上的操作

    该示例显示了如何使用动态代理调用使用简单类型和复杂类型的操作。使用流程如下所示

  • 创建代理工厂,指定服务的WSDL URI

    DynamicProxy工厂=新的DynamicProxy工厂(“”)

  • 浏览端点、元数据、合同等

  • 通过指定端点或协定名称来创建端点的DynamicProxy
  • 调用DynamicProxy上的操作
  • 关闭DynamicProxy
  • 要运行示例:编译解决方案,请运行CalculatorService.exe,然后运行CalculatorDynamicClient.exe

  • ,也是


您需要生成一个代理类;这将生成调用服务操作所需的一切

有几种方法可以生成代理类

  • 您可以向项目添加服务引用
  • 运行SVCUTIL:SVCUTIL

  • 一旦代理类生成,它就会将服务的操作作为方法公开。只要调用所需的方法,就会为您生成SOAP信封。

    非常感谢!这非常有用。RE:这些服务是由用户在运行时添加的。。。您希望自动调用函数吗?e、 g.这是某种类型的测试线束/接口吗?假设服务1接受Lat/Lon并返回天气信息。现在有人添加了一个同样接受Lat/Lon的Service2。你想继续并调用它吗?(事实证明,Service2在该位置上倾倒了一桶油漆。)我的观点是,除了测试场景之外,您可能不希望自动调用某些新服务。如果是这种情况,您可能不需要动态生成代理。
    factory.Endpoints factory.Metadata factory.Contracts factory.Bindings
    
    DynamicProxy proxy = factory.CreateProxy("ISimpleCalculator");
    
    DynamicProxy proxy = factory.CreateProxy(endpoint); 
    
    double result = (dobule)proxy.CallMethod("Add", 1d ,2d);
    
    proxy.Close();