Как использовать веб-сервис ColdFusion с помощью dotnet - PullRequest
5 голосов
/ 09 марта 2012

У меня совсем нет опыта работы с SOAP и веб-сервисами.Я пытаюсь вызвать веб-сервис ColdFusion из C # (.NET 4.0).Я генерирую прокси из WSDL с svcutil.exe.Веб-сервис работает, когда я вызываю ListCases из SoapUI, но когда я вызываю его из прокси-сервера, я получаю карту с одним mapItem, и этот mapItem имеет нулевой элемент и значение.Я предполагаю, что это не работает, потому что WSDL не содержит определения для QueryBean.Если это проблема, я постараюсь попросить автора веб-службы добавить определение, в противном случае у меня есть какие-либо варианты, кроме синтаксического анализа XML вручную?

<wsdl:definitions xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://syndication.v63" xmlns:intf="http://syndication.v63" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="http://rpc.xml.coldfusion" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://syndication.v63">
  <!-- WSDL created by ColdFusion version 9,0,1,274733 -->
  <wsdl:types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://xml.apache.org/xml-soap">
      <import namespace="http://rpc.xml.coldfusion"/>
      <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
      <complexType name="mapItem">
        <sequence>
          <element name="key" nillable="true" type="xsd:anyType"/>
          <element name="value" nillable="true" type="xsd:anyType"/>
        </sequence>
      </complexType>
      <complexType name="Map">
        <sequence>
          <element maxOccurs="unbounded" minOccurs="0" name="item" type="apachesoap:mapItem"/>
        </sequence>
      </complexType>
    </schema>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://rpc.xml.coldfusion">
      <import namespace="http://xml.apache.org/xml-soap"/>
      <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
      <complexType name="CFCInvocationException">
        <sequence/>
      </complexType>
    </schema>
  </wsdl:types>
  <wsdl:message name="ListCasesResponse">
    <wsdl:part name="ListCasesReturn" type="apachesoap:Map"/>
  </wsdl:message>
  <wsdl:message name="FolderDetailsResponse">
    <wsdl:part name="FolderDetailsReturn" type="apachesoap:Map"/>
  </wsdl:message>
  <wsdl:message name="ListBoxesRequest">
    <wsdl:part name="CaseDatabase" type="xsd:string"/>
    <wsdl:part name="Prefix" type="xsd:string"/>
  </wsdl:message>
  <wsdl:message name="ListFoldersRequest">
    <wsdl:part name="CaseDatabase" type="xsd:string"/>
    <wsdl:part name="Prefix" type="xsd:string"/>
    <wsdl:part name="Box" type="xsd:string"/>
  </wsdl:message>
  <wsdl:message name="CFCInvocationException">
    <wsdl:part name="fault" type="tns1:CFCInvocationException"/>
  </wsdl:message>
  <wsdl:message name="ListPrefixesRequest">
    <wsdl:part name="CaseDatabase" type="xsd:string"/>
  </wsdl:message>
  <wsdl:message name="ListFoldersResponse">
    <wsdl:part name="ListFoldersReturn" type="apachesoap:Map"/>
  </wsdl:message>
  <wsdl:message name="ListPrefixesResponse">
    <wsdl:part name="ListPrefixesReturn" type="apachesoap:Map"/>
  </wsdl:message>
  <wsdl:message name="FolderDetailsRequest">
    <wsdl:part name="CaseDatabase" type="xsd:string"/>
    <wsdl:part name="Prefix" type="xsd:string"/>
    <wsdl:part name="Box" type="xsd:string"/>
    <wsdl:part name="Folder" type="xsd:string"/>
  </wsdl:message>
  <wsdl:message name="ListCasesRequest"></wsdl:message>
  <wsdl:message name="ListBoxesResponse">
    <wsdl:part name="ListBoxesReturn" type="apachesoap:Map"/>
  </wsdl:message>
  <wsdl:portType name="Ricoh_syndication">
    <wsdl:operation name="ListCases">
      <wsdl:input message="impl:ListCasesRequest" name="ListCasesRequest"/>
      <wsdl:output message="impl:ListCasesResponse" name="ListCasesResponse"/>
      <wsdl:fault message="impl:CFCInvocationException" name="CFCInvocationException"/>
    </wsdl:operation>
    <wsdl:operation name="FolderDetails" parameterOrder="CaseDatabase Prefix Box Folder">
      <wsdl:input message="impl:FolderDetailsRequest" name="FolderDetailsRequest"/>
      <wsdl:output message="impl:FolderDetailsResponse" name="FolderDetailsResponse"/>
      <wsdl:fault message="impl:CFCInvocationException" name="CFCInvocationException"/>
    </wsdl:operation>
    <wsdl:operation name="ListFolders" parameterOrder="CaseDatabase Prefix Box">
      <wsdl:input message="impl:ListFoldersRequest" name="ListFoldersRequest"/>
      <wsdl:output message="impl:ListFoldersResponse" name="ListFoldersResponse"/>
      <wsdl:fault message="impl:CFCInvocationException" name="CFCInvocationException"/>
    </wsdl:operation>
    <wsdl:operation name="ListPrefixes" parameterOrder="CaseDatabase">
      <wsdl:input message="impl:ListPrefixesRequest" name="ListPrefixesRequest"/>
      <wsdl:output message="impl:ListPrefixesResponse" name="ListPrefixesResponse"/>
      <wsdl:fault message="impl:CFCInvocationException" name="CFCInvocationException"/>
    </wsdl:operation>
    <wsdl:operation name="ListBoxes" parameterOrder="CaseDatabase Prefix">
      <wsdl:input message="impl:ListBoxesRequest" name="ListBoxesRequest"/>
      <wsdl:output message="impl:ListBoxesResponse" name="ListBoxesResponse"/>
      <wsdl:fault message="impl:CFCInvocationException" name="CFCInvocationException"/>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="ricoh_syndication.cfcSoapBinding" type="impl:Ricoh_syndication">
    <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="ListCases">
      <wsdlsoap:operation soapAction=""/>
      <wsdl:input name="ListCasesRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:input>
      <wsdl:output name="ListCasesResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:output>
      <wsdl:fault name="CFCInvocationException">
        <wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="CFCInvocationException" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:fault>
    </wsdl:operation>
    <wsdl:operation name="FolderDetails">
      <wsdlsoap:operation soapAction=""/>
      <wsdl:input name="FolderDetailsRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:input>
      <wsdl:output name="FolderDetailsResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:output>
      <wsdl:fault name="CFCInvocationException">
        <wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="CFCInvocationException" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:fault>
    </wsdl:operation>
    <wsdl:operation name="ListFolders">
      <wsdlsoap:operation soapAction=""/>
      <wsdl:input name="ListFoldersRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:input>
      <wsdl:output name="ListFoldersResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:output>
      <wsdl:fault name="CFCInvocationException">
        <wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="CFCInvocationException" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:fault>
    </wsdl:operation>
    <wsdl:operation name="ListPrefixes">
      <wsdlsoap:operation soapAction=""/>
      <wsdl:input name="ListPrefixesRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:input>
      <wsdl:output name="ListPrefixesResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:output>
      <wsdl:fault name="CFCInvocationException">
        <wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="CFCInvocationException" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:fault>
    </wsdl:operation>
    <wsdl:operation name="ListBoxes">
      <wsdlsoap:operation soapAction=""/>
      <wsdl:input name="ListBoxesRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:input>
      <wsdl:output name="ListBoxesResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:output>
      <wsdl:fault name="CFCInvocationException">
        <wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="CFCInvocationException" namespace="http://syndication.v63" use="encoded"/>
      </wsdl:fault>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="Ricoh_syndicationService">
    <wsdl:port binding="impl:ricoh_syndication.cfcSoapBinding" name="ricoh_syndication.cfc">
      <wsdlsoap:address location="https://www2.delium.com/v6-3/syndication/ricoh_syndication.cfc"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

и результат (I 'мы изменили его, чтобы иметь более короткий список данных и не содержать конфиденциальную информацию)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <ns1:ListCasesResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://syndication.v63">
         <ListCasesReturn xsi:type="ns2:Map" xmlns:ns2="http://xml.apache.org/xml-soap">
            <item xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
               <key xsi:type="soapenc:string">RETURNCODE</key>
               <value xsi:type="soapenc:string">1</value>
            </item>
            <item>
               <key xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">RETURNTEXT</key>
               <value xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">Success (1)</value>
            </item>
            <item>
               <key xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">OUTPUTS</key>
               <value xsi:type="ns2:Map">
                  <item xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
                     <key xsi:type="soapenc:string">QCASES</key>
                     <value xsi:type="ns3:QueryBean" xmlns:ns3="http://rpc.xml.coldfusion">
                        <columnList soapenc:arrayType="xsd:string[2]" xsi:type="soapenc:Array">
                           <columnList xsi:type="xsd:string">CASENAME</columnList>
                           <columnList xsi:type="xsd:string">CASEDATABASE</columnList>
                        </columnList>
                        <data soapenc:arrayType="xsd:anyType[][35]" xsi:type="soapenc:Array">
                           <data soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array">
                              <data xsi:type="soapenc:string">test1</data>
                              <data xsi:type="soapenc:string">test2</data>
                           </data>
                        </data>
                     </value>
                  </item>
                  <item>
                     <key xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">REMOTEIPADDRESS</key>
                     <value xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">219.89.202.100</value>
                  </item>
               </value>
            </item>
         </ListCasesReturn>
      </ns1:ListCasesResponse>
   </soapenv:Body>
</soapenv:Envelope>

1 Ответ

2 голосов
/ 13 марта 2012

yes похоже, что в WSDL не определен тип ns3: QueryBean, и прокси-сервер не может десериализовать его для этого типа;Лучшим вариантом будет попросить автора веб-сервиса предоставить вам все необходимые типы.Должно быть, они уже определили все типы на своих концах, поэтому может быть проще получить их XSD с определениями типов или WSDL, который содержит типы.

В случае, когда они динамически генерируют случайные типы (например, QueryBean, Foo, Foobar) и т. Д., Тогда вам может не повезти, и в этом случае нет другого способа, кроме ручного обхода xml.

...