从具有嵌套复杂类型的WSDL创建Web Service使用者

时间:2013-09-16 17:40:15

标签: c# web-services wsdl

我正在尝试创建一个Web服务使用者,给定一个已经启动并运行的服务的WSDL。挑战在于,在运行时动态地完成整个事情。我正在使用C#。总而言之,我必须做到以下几点:

  1. 我有一个应用程序,它将作为WSDL文件(url)的输入。的完成
  2. 应用程序将深入查看WSDL文件,识别操作,消息和使用的类型。 (指出我遇到了麻烦
  3. 它将创建调用Web Service所需的代码,编译它并通过反射加载它。的完成
  4. 准备好调用所有内容,包括创建必要的参数并将其发送到远程方法。然后它会正确处理响应。的完成
  5. 我遇到了#2的一些问题,它在WSDL文件中进行了解析和深入分析。具体来说:提取看似“嵌套”的复杂类型。

    我已经阅读了一些关于提取复杂类型的非常有用的资源:

    Parse Complex WSDL Parameter Information

    Detailed ServiceDescription / Proxy from WSDL

    http://mikehadlow.blogspot.com/2006/06/simple-wsdl-object.html

    但是,我对我收到的用于测试的示例WSDL感到有些困惑:

    <definitions name='MyWSService' targetNamespace='http://some.url.com/' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://some.url.com/' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
     <types>
      <xs:schema attributeFormDefault='qualified' elementFormDefault='qualified' targetNamespace='http://some.url.com/' version='1.0' xmlns:tns='http://some.url.com/' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
       <xs:element name='dsSendOperationName' type='tns:systemSendOperationName'/>
       <xs:element name='dsSendOperationNameResponse' type='tns:systemSendOperationNameResponse'/>
       <xs:complexType name='systemSendOperationName'>
        <xs:sequence>
         <xs:element minOccurs='0' name='systemOperationName' type='tns:systemOperationName'/>
        </xs:sequence>
       </xs:complexType>
       <xs:complexType name='systemOperationName'>
        <xs:sequence>
         <xs:element minOccurs='0' name='param1' type='xs:string'/>
         <xs:element minOccurs='0' name='param2' type='xs:string'/>
         <xs:element minOccurs='0' name='param3' type='xs:string'/>
         <xs:element minOccurs='0' name='param4' type='xs:string'/>
         <xs:element minOccurs='0' name='param5' type='xs:string'/>
        </xs:sequence>
       </xs:complexType>
       <xs:complexType name='systemSendOperationNameResponse'>
        <xs:sequence>
         <xs:element minOccurs='0' name='return' type='xs:string'/>
        </xs:sequence>
       </xs:complexType>
      </xs:schema>
     </types>
     <message name='SystemOperationNameWS_dsSendOperationName'>
      <part element='tns:dsSendOperationName' name='dsSendOperationName'></part>
     </message>
     <message name='SystemOperationNameWS_dsSendOperationNameResponse'>
      <part element='tns:dsSendOperationNameResponse' name='dsSendOperationNameResponse'></part>
     </message>
     <portType name='SystemOperationNameWS'>
      <operation name='dsSendOperationName' parameterOrder='dsSendOperationName'>
       <input message='tns:SystemOperationNameWS_dsSendOperationName'></input>
       <output message='tns:SystemOperationNameWS_dsSendOperationNameResponse'></output>
      </operation>
     </portType>
     <binding name='SystemOperationNameWSBinding' type='tns:SystemOperationNameWS'>
      <soap:binding style='document' transport='http://schemas.xmlsoap.org/soap/http'/>
      <operation name='dsSendOperationName'>
       <soap:operation soapAction=''/>
       <input>
        <soap:body use='literal'/>
       </input>
       <output>
        <soap:body use='literal'/>
       </output>
      </operation>
     </binding>
     <service name='SystemOperationNameWSService'>
      <port binding='tns:SystemOperationNameWSBinding' name='SystemOperationNameWSPort'>
       <soap:address location='http://a.url.here.com'/>
      </port>
     </service>
    </definitions>
    

    查看根元素(如消息部分中所定义)是指一个复杂类型,它具有稍后声明为复杂类型的元素,最终具有一系列具有标准XSD类型的元素。

    以编程方式,我能够深入到该“链”的最后一个元素。但是,我对发送到Web服务的实际消息的类型感到困惑。是吗:

    1. 包含systemOperationName的systemSendOperationName,包含5个字符串? 或
    2. 包含5个字符串的systemOperationName对象?
    3. 总的来说,那种嵌套类型是否正常?到目前为止,我还没有找到类似的例子。

      编辑:

      使我的初始帖子中的一些要点更加明确,以避免任何混淆。

0 个答案:

没有答案