2009-12-17 8 views
6

Próbowałem od kilku dni, aby klient .NET pracował w pełni z serwerem sieci Web dostarczonym przez moją platformę Coldfusion Aplikacja internetowa. Nie jestem deweloperem .NET, per se, ale zdarza mi się mieć kopię VS 2003, która wygląda na to, że powinna wystarczyć.Zagnieżdżone elementy złożone nigdy nie są zapełniane podczas wywoływania usługi WWW opartej na AXIS od .NET

Mogę użyć prostej metody mnożnika() w mojej usłudze sieciowej, która pobiera dwie liczby i zwraca liczbę, więc typy proste działają poprawnie. To skomplikowane typy mnie zabijają. Zasadniczo próbuję zwrócić tablicę asocjacyjną z metody o nazwie get_struct(). Otrzymuję obiekt typu Map Back, ale właściwość (nazywana elementem), która ma być tablicą z dwoma elementami (typu mapItem) zawsze ma "wartość nieokreśloną".

Oto WSDL, który jest generowany przez ColdFusion:

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions targetNamespace="http://trunk.v.pfapi.remote_api" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://trunk.v.pfapi.remote_api" xmlns:intf="http://trunk.v.pfapi.remote_api" 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"> 
<!--WSDL created by Macromedia ColdFusion MX version 7,0,2,142559--> 
<wsdl:types> 
    <schema targetNamespace="http://rpc.xml.coldfusion" xmlns="http://www.w3.org/2001/XMLSchema"> 
    <import namespace="http://trunk.v.pfapi.remote_api"/> 
    <import namespace="http://xml.apache.org/xml-soap"/> 
    <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> 
    <complexType name="CFCInvocationException"> 
    <sequence/> 
    </complexType> 
    <complexType name="QueryBean"> 
    <sequence> 
    <element name="columnList" nillable="true" type="impl:ArrayOf_xsd_string"/> 
    <element name="data" nillable="true" type="impl:ArrayOfArrayOf_xsd_anyType"/> 
    </sequence> 
    </complexType> 
    </schema> 
    <schema targetNamespace="http://xml.apache.org/xml-soap" xmlns="http://www.w3.org/2001/XMLSchema"> 
    <import namespace="http://trunk.v.pfapi.remote_api"/> 
    <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 targetNamespace="http://trunk.v.pfapi.remote_api" xmlns="http://www.w3.org/2001/XMLSchema"> 
    <import namespace="http://rpc.xml.coldfusion"/> 
    <import namespace="http://xml.apache.org/xml-soap"/> 
    <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> 
    <complexType name="ArrayOf_xsd_string"> 
    <complexContent> 
    <restriction base="soapenc:Array"> 
     <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/> 
    </restriction> 
    </complexContent> 
    </complexType> 
    <complexType name="ArrayOfArrayOf_xsd_anyType"> 
    <complexContent> 
    <restriction base="soapenc:Array"> 
     <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:anyType[][]"/> 
    </restriction> 
    </complexContent> 
    </complexType> 
    </schema> 
</wsdl:types> 
    <wsdl:message name="CFCInvocationException"> 
     <wsdl:part name="fault" type="tns1:CFCInvocationException"/> 
    </wsdl:message> 
    <wsdl:message name="multiplierResponse"> 
     <wsdl:part name="multiplierReturn" type="xsd:double"/> 
    </wsdl:message> 
    <wsdl:message name="get_structResponse"> 
     <wsdl:part name="get_structReturn" type="apachesoap:Map"/> 
    </wsdl:message> 
    <wsdl:message name="struct_keycountResponse"> 
     <wsdl:part name="struct_keycountReturn" type="xsd:double"/> 
    </wsdl:message> 
    <wsdl:message name="get_structRequest"> 
    </wsdl:message> 
    <wsdl:message name="multiplierRequest"> 
     <wsdl:part name="factor1" type="xsd:double"/> 
     <wsdl:part name="factor2" type="xsd:double"/> </wsdl:message> 
    <wsdl:message name="struct_keycountRequest"> 
     <wsdl:part name="theStruct" type="apachesoap:Map"/> 
    </wsdl:message> 
    <wsdl:portType name="remote_io_test"> 
     <wsdl:operation name="multiplier" parameterOrder="factor1 factor2"> 
     <wsdl:input message="impl:multiplierRequest" name="multiplierRequest"/> 
     <wsdl:output message="impl:multiplierResponse" name="multiplierResponse"/> 
     <wsdl:fault message="impl:CFCInvocationException" name="CFCInvocationException"/> 
     </wsdl:operation> 
     <wsdl:operation name="get_struct"> 
     <wsdl:input message="impl:get_structRequest" name="get_structRequest"/> 
     <wsdl:output message="impl:get_structResponse" name="get_structResponse"/> 
     <wsdl:fault message="impl:CFCInvocationException" name="CFCInvocationException"/> 
     </wsdl:operation> 
     <wsdl:operation name="struct_keycount" parameterOrder="theStruct"> 
     <wsdl:input message="impl:struct_keycountRequest" name="struct_keycountRequest"/> 
     <wsdl:output message="impl:struct_keycountResponse" name="struct_keycountResponse"/> 
     <wsdl:fault message="impl:CFCInvocationException" name="CFCInvocationException"/> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="remote_io_test.cfcSoapBinding" type="impl:remote_io_test"> 
     <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> 
     <wsdl:operation name="multiplier"> 
     <wsdlsoap:operation soapAction=""/> 
     <wsdl:input name="multiplierRequest"> 
      <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://trunk.v.pfapi.remote_api" use="encoded"/> 
     </wsdl:input> 
     <wsdl:output name="multiplierResponse"> 
      <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://trunk.v.pfapi.remote_api" use="encoded"/> 
     </wsdl:output> 
     <wsdl:fault name="CFCInvocationException"> 
      <wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="CFCInvocationException" namespace="http://trunk.v.pfapi.remote_api" use="encoded"/> 
     </wsdl:fault> 
     </wsdl:operation> 
     <wsdl:operation name="get_struct"> 
     <wsdlsoap:operation soapAction=""/> 
     <wsdl:input name="get_structRequest"> 
      <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://trunk.v.pfapi.remote_api" use="encoded"/> 
     </wsdl:input> 
     <wsdl:output name="get_structResponse"> 
      <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://trunk.v.pfapi.remote_api" use="encoded"/> 
     </wsdl:output> 
     <wsdl:fault name="CFCInvocationException"> 
      <wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="CFCInvocationException" namespace="http://trunk.v.pfapi.remote_api" use="encoded"/> 
     </wsdl:fault> 
     </wsdl:operation> 
     <wsdl:operation name="struct_keycount"> 
     <wsdlsoap:operation soapAction=""/> 
     <wsdl:input name="struct_keycountRequest"> 
      <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://trunk.v.pfapi.remote_api" use="encoded"/> 
     </wsdl:input> 
     <wsdl:output name="struct_keycountResponse"> 
      <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://trunk.v.pfapi.remote_api" use="encoded"/> 
     </wsdl:output> 
     <wsdl:fault name="CFCInvocationException"> 
      <wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="CFCInvocationException" namespace="http://trunk.v.pfapi.remote_api" use="encoded"/> 
     </wsdl:fault> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="remote_io_testService"> 
    <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
This is a collection of test methods to allow remote developers 
    to evaluate datatype support, etc in their programming environment. 
    The WSDL endpoint for this web service is [YOUR PEERFOCUS SITE]/remote_api/pfapi/v/trunk/remote_io_test.cfc?wsdl </wsdl:documentation> 
     <wsdl:port binding="impl:remote_io_test.cfcSoapBinding" name="remote_io_test.cfc"> 
     <wsdlsoap:address location="http://leon.cupahr.tafkan.localhost/remote_api/pfapi/v/trunk/remote_io_test.cfc"/> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

i oto en serwis internetowy generowany kiedy dodać odwołanie WWW w VS:

//------------------------------------------------------------------------------ 
// <autogenerated> 
//  This code was generated by a tool. 
//  Runtime Version: 1.1.4322.2443 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </autogenerated> 
//------------------------------------------------------------------------------ 

// 
// This source code was auto-generated by Microsoft.VSDesigner, Version 1.1.4322.2443. 
// 
namespace pfapi_test.remote_io_test { 
    using System.Diagnostics; 
    using System.Xml.Serialization; 
    using System; 
    using System.Web.Services.Protocols; 
    using System.ComponentModel; 
    using System.Web.Services; 


    /// <remarks/> 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Web.Services.WebServiceBindingAttribute(Name="remote_io_test.cfcSoapBinding", Namespace="http://trunk.v.pfapi.remote_api")] 
    [System.Xml.Serialization.SoapIncludeAttribute(typeof(QueryBean))] 
    [System.Xml.Serialization.SoapIncludeAttribute(typeof(CFCInvocationException))] 
    public class remote_io_testService : System.Web.Services.Protocols.SoapHttpClientProtocol { 

     /// <remarks/> 
     public remote_io_testService() { 
      this.Url = "http://leon.cupahr.tafkan.nooch/remote_api/pfapi/v/trunk/remote_io_test.cfc"; 
     } 

     /// <remarks/> 
     [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://trunk.v.pfapi.remote_api", ResponseNamespace="http://trunk.v.pfapi.remote_api")] 
     [return: System.Xml.Serialization.SoapElementAttribute("multiplierReturn")] 
     public System.Double multiplier(System.Double factor1, System.Double factor2) { 
      object[] results = this.Invoke("multiplier", new object[] { 
         factor1, 
         factor2}); 
      return ((System.Double)(results[0])); 
     } 

     /// <remarks/> 
     public System.IAsyncResult Beginmultiplier(System.Double factor1, System.Double factor2, System.AsyncCallback callback, object asyncState) { 
      return this.BeginInvoke("multiplier", new object[] { 
         factor1, 
         factor2}, callback, asyncState); 
     } 

     /// <remarks/> 
     public System.Double Endmultiplier(System.IAsyncResult asyncResult) { 
      object[] results = this.EndInvoke(asyncResult); 
      return ((System.Double)(results[0])); 
     } 

     /// <remarks/> 
     [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://trunk.v.pfapi.remote_api", ResponseNamespace="http://trunk.v.pfapi.remote_api")] 
     [return: System.Xml.Serialization.SoapElementAttribute("get_structReturn")] 
     public Map get_struct() { 
      object[] results = this.Invoke("get_struct", new object[0]); 
      return ((Map)(results[0])); 
     } 

     /// <remarks/> 
     public System.IAsyncResult Beginget_struct(System.AsyncCallback callback, object asyncState) { 
      return this.BeginInvoke("get_struct", new object[0], callback, asyncState); 
     } 

     /// <remarks/> 
     public Map Endget_struct(System.IAsyncResult asyncResult) { 
      object[] results = this.EndInvoke(asyncResult); 
      return ((Map)(results[0])); 
     } 

     /// <remarks/> 
     [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://trunk.v.pfapi.remote_api", ResponseNamespace="http://trunk.v.pfapi.remote_api")] 
     [return: System.Xml.Serialization.SoapElementAttribute("struct_keycountReturn")] 
     public System.Double struct_keycount(Map theStruct) { 
      object[] results = this.Invoke("struct_keycount", new object[] { 
         theStruct}); 
      return ((System.Double)(results[0])); 
     } 

     /// <remarks/> 
     public System.IAsyncResult Beginstruct_keycount(Map theStruct, System.AsyncCallback callback, object asyncState) { 
      return this.BeginInvoke("struct_keycount", new object[] { 
         theStruct}, callback, asyncState); 
     } 

     /// <remarks/> 
     public System.Double Endstruct_keycount(System.IAsyncResult asyncResult) { 
      object[] results = this.EndInvoke(asyncResult); 
      return ((System.Double)(results[0])); 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.SoapTypeAttribute("Map", "http://xml.apache.org/xml-soap")] 
    public class Map { 

     /// <remarks/> 
     public mapItem[] item; 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.SoapTypeAttribute("mapItem", "http://xml.apache.org/xml-soap")] 
    public class mapItem { 

     /// <remarks/> 
     public object key; 

     /// <remarks/> 
     public object value; 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.SoapTypeAttribute("QueryBean", "http://rpc.xml.coldfusion")] 
    public class QueryBean { 

     /// <remarks/> 
     public string[] columnList; 

     /// <remarks/> 
     public object[] data; 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.SoapTypeAttribute("CFCInvocationException", "http://rpc.xml.coldfusion")] 
    public class CFCInvocationException { 
    } 
} 

I wreszcie moja CLI aplikacja, która testuje usługę:

using System; 

namespace pfapi_test 
{ 
/// <summary> 
/// Summary description for Class1. 
/// </summary> 
class Class1 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main(string[] args) 
    { 
    // 
    // TODO: Add code to start application here 
    // 

    Console.WriteLine("Instantiating WS"); 

    remote_io_test.remote_io_testService testWS = new remote_io_test.remote_io_testService(); 

    Console.WriteLine("Calling multiplier(3,15)"); 
    Console.WriteLine(testWS.multiplier(3,15)); 

    Console.WriteLine("Calling get_struct()"); 
    remote_io_test.Map theStruct = testWS.get_struct(); 
    Console.Write("result: "); 
    Console.WriteLine(theStruct); 
    Console.Write("result.item: "); 
    Console.WriteLine(theStruct.item); 

    Console.WriteLine("Press Enter to exit..."); 
    Console.ReadLine(); 
    } 
} 
} 

Bez względu na to, co próbuję, TheStruct.item jest zawsze "undef wartość "według debuggera. Wydrukowany wydruk wygląda następująco:

Instantiating WS 
Calling multiplier(3,15) 
45 
Calling get_struct() 
result: pfapi_test.remote_io_test.Map 
result.item: 
Press Enter to exit... 

Próbowałem używać ColdFusion 8 i nie ma różnicy. Próbowałem zwrócić prawdziwą niestandardową bazę danych z dwiema właściwościami zamiast mojej tablicy asocjacyjnej ad-hoc i działa to dobrze, ale przepisanie mojego interfejsu API w celu uniknięcia tablic asocjacyjnych nie jest w tej chwili opcją. Interfejs API działa dobrze z ColdFusion, PHP/NuSOAP i Ruby on Rails, więc wydaje się, że powinno być możliwe, aby działał również z .NET.

Mam nadzieję, że ktoś może zapewnić pewien wgląd. Podejrzewam, że jest tu jakiś problem z przestrzenią nazw, ale nie znam SOAP i XML wystarczająco dobrze, aby dowiedzieć się, co to jest. Szukałem też jak szalonego rozwiązania online, ale nie znalazłem ani jednej osoby, która rozwiązałaby ten problem, co jest bardzo przygnębiające!

Zapytanie:

POST /remote_api/pfapi/v/trunk/remote_io_test.cfc HTTP/1.1 
VsDebuggerCausalityData: [snip] 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 1.1.4322.2443) 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "" 
Content-Length: 488 
Expect: 100-continue 
Host: leon.cupahr.tafkan.nooch 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://trunk.v.pfapi.remote_api" xmlns:types="http://trunk.v.pfapi.remote_api/encodedTypes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <tns:get_struct /> 
    </soap:Body> 
</soap:Envelope> 

Response:

HTTP/1.1 200 OK 
Date: Thu, 17 Dec 2009 15:14:33 GMT 
Server: Apache/2.2.11 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.7l DAV/2 PHP/5.2.8 JRun/4.0 Phusion_Passenger/2.2.7 
Set-Cookie: CFID=21543;expires=Sat, 10-Dec-2039 15:14:33 GMT;path=/ 
Set-Cookie: CFTOKEN=479cc311ca4875db-9D346355-ED36-6183-C8895635E4EE1252;expires=Sat, 10-Dec-2039 15:14:33 GMT;path=/ 
Transfer-Encoding: chunked 
Content-Type: text/xml; charset=utf-8 

<?xml version="1.0" encoding="utf-8"?> 
<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:get_structResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://trunk.v.pfapi.remote_api"> 
    <get_structReturn 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">FOO</key> 
    <value xsi:type="soapenc:string">bar</value> 
    </item> 
    <item> 
    <key xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">ANOTHERKEY</key> 
    <value xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">another value</value> 
    </item> 
    </get_structReturn> 
    </ns1:get_structResponse> 
</soapenv:Body> 
</soapenv:Envelope> 

Aktualizacja: Słyszałem od dewelopera .NET na drugim końcu, a on próbował wszystkich następujących bezskutecznie:

  • przy użyciu WCF zamiast ASMX
  • przy użyciu .NET 3.5
  • użyciu VB.NET do komunikowania się z usługą internetową zamiast C#

on wysłał mi zrzut ekranu sekcji „Typ danych” w oknie Ustawienia referencyjne serwisowym. Czy to możliwe, że zmiana ustawień typu kolekcji i kolekcji słowników może rozwiązać ten problem?

Aktualizacja 2: oto kod ColdFusion dla testu zdalnego_io_.CFC

<cfcomponent name="remote_io_test" 
    hint="This is a collection of test methods to allow remote developers 
     to evaluate datatype support, etc in their programming environment."> 

<cffunction name="get_struct" returntype="struct" access="remote" output="no" 
     hint="Returns an associative array with two keys, 'foo' and 'anotherKey'. 
      Allows you to test your implementation's support for WDDX encoding. 
      ColdFusion and PHP (w/ NuSOAP) will automatically decode the result 
      into an associative array. Feedback on other languages is appreciated."> 
    <cfset var stFoo = structNew()> 
    <cfset stFoo.foo = "bar"> 
    <cfset stFoo.anotherKey = "another value"> 
    <cfreturn duplicate(stFoo)> 
</cffunction> <!--- get_struct ---> 


<cffunction name="multiplier" returntype="numeric" access="remote" output="no" 
     hint="Multiplies two factors and returns the result. Allows you to test 
      passing simple variables to a remote method."> 
    <cfargument name="factor1" type="numeric" required="yes"> 
    <cfargument name="factor2" type="numeric" required="yes"> 

    <cfreturn factor1 * factor2> 
</cffunction> <!--- multiplier ---> 


<cffunction name="struct_keycount" returntype="numeric" access="remote" output="no" 
     hint="Returns the number of keys in an upload associative array. Allows 
      you to test passing complex variables to a remote method."> 
    <cfargument name="theStruct" type="struct" required="yes"> 

    <cfreturn structCount(theStruct)> 
</cffunction> <!--- struct_keycount ---> 

Dzięki za czytanie i dzięki z góry za odpowiedzi!

Trasy wysłane na link text

+0

byłaś zdecydowana jeśli to jest problem z serwerem lub klientem? (Czy są jakieś inne oprogramowanie klienckie z powodzeniem wywołujące get_struct()?) –

+0

Czy możesz dodać prosty, samodzielny przykład kodu ColdFusion, w którym twoja aplikacja .net jest blokowana, więc niektórzy z nas mogą go przetestować? – kevink

+0

@ Dan Sorensen, dzięki za pytanie. Mam klientów Coldfusion, PHP i Ruby on Rails, które pomyślnie wysyłają i odbierają struktury w moim prawdziwym API. Ta usługa sieci Web służy do testowania interoperacyjności, gdy ludzie zaczynają korzystać z interfejsu API. – sbleon

Odpowiedz

1

Odpowiedź brzmi: nie używaj struktur Coldfusion w swoim serwisie internetowym.

Podobnie jak wszyscy przed nami, zrezygnowaliśmy i przepisaliśmy nasz interfejs API, aby nie używać żadnych tablic asocjacyjnych w żądaniu lub odpowiedzi. Używamy teraz skalarów, tablic i złożonych typów, które są automatycznie tworzone z CFC. Tym razem przetestowaliśmy nasz proof-of-concept za pomocą PHP, Ruby, Coldfusion, Java i .NET, aby upewnić się, że jest rzeczywiście interoperacyjny.

Ma to sens, że język statycznie napisany nie byłby w stanie obsłużyć całkowicie arbitralnego zdalnego typu danych w sensowny sposób.

Dzięki za wszystkie opinie!

2

mam zmaga się z tej pozycji się od strony klienta .NET rzeczy - staram się zużywają usługi sieci web napisane w ColdFusion. Z dokumentacji, którą znalazłem, typ danych strukturalnych w ColdFusion nie mapuje bezpośrednio na żadne typy usług WWW i wydaje mi się, że jest to usterka w Osi.

Prawdopodobnie przeczytałeś te same strony internetowe, co ja, próbując rozwiązać ten problem, ale wydaje się, że jeśli chcesz utworzyć usługę sieciową za pomocą ColdFusion, zaleca się, aby nie używać typu struct. Jeśli twoja usługa sieciowa nie jest jeszcze dostępna i możesz uciec z użyciem czegoś innego, proponuję zejść tą trasą. Próbowałem zwracać obiekty z ColdFusion, które działały dobrze dla mnie z klienta .NET.

Właściwie to zrezygnowałem z tego problemu i napisałem niestandardowego klienta dla mojego programu .NET, który po prostu odczytał Xml zwrócony przez serwis internetowy ColdFusion i przekonwertował go na słownik, ponieważ nie mam żadnego wpływu na usługę. próbuje zadzwonić.

Jedna rzecz, którą znalazłem podczas moich testów - usługa, którą próbuję wywołać, działa na starszej wersji ColdFusion (7 wierzę). Ilekroć wywołuję tę usługę, klient .NET zwraca wartość null. Zainstalowałem ColdFusion na mojej maszynie i napisałem prostą usługę, i odkryłem, że klient .NET zwrócił obiekt typu Map (który pochodził z WSDL), ale właściwości obiektu Map były zerowe.

Chciałbym sprawdzić, czy sugestia autorstwa Chrisa Haasa w komentarzach do pytania o ustawienie dotNetSoapEncFix rozwiązuje problem.

+0

Dzięki, Richard. Patrzę na moje opcje. Myślę, że będę musiał użyć formatu opartego na ciągach (XML lub JSON) dla mojego API. Każde rozwiązanie dotyczące złożonych typów danych po prostu wymaga kłopotów, gdy próbujemy połączyć luźny/mocno napisany podział językowy. – sbleon

+0

Patrząc na dokumentację osi 1.2, zdają się mówić, że nie używamy hashtables (tj. Struktur CF), zwłaszcza z .net http://ws.apache.org/axis/java/user-guide.html#WhatAxisCanSendViaSOAPWithRestrictedInteroperability – Leigh

0

Jest rozwiązanie problemu i to jest tutaj:

http://ws-i.org/Profiles/BasicProfile-2.0-2010-11-09.html#soapenc_Array

http://ws-i.org/Profiles/BasicProfile-1.2-2010-11-09.html#soapenc_Array

Twój problem leży tutaj, aby być dokładnym:

<complexType name="ArrayOf_xsd_string"> 
    <complexContent> 
    <restriction base="soapenc:Array"> 
     <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/> 
    </restriction> 
    </complexContent> 
    </complexType> 
    <complexType name="ArrayOfArrayOf_xsd_anyType"> 
    <complexContent> 
    <restriction base="soapenc:Array"> 
     <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:anyType[][]"/> 
    </restriction> 
    </complexContent> 
    </complexType> 

Wystarczy przedefiniować te typy jak to:

<element name="ArrayOf_xsd_string" type="tns:OnlyStringArrayType"/> 
<complexType name="OnlyStringArrayType"> 
    <sequence> 
    <element name="array_element" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> 
    </sequence> 
</complexType> 
<element name="ArrayOfArrayOf_xsd_anyType" type="tns:AnyTypeArrayType"/> 
<complexType name="AnyTypeArrayType"> 
    <sequence> 
    <element name="array_element" type="xsd:anyType" minOccurs="0" maxOccurs="unbounded"/> 
    </sequence> 
</complexType> 

nadal nie jest w pełni zgodny z wymienionymi wyżej profilami WS-I, ze względu na nazwy elementów, ale powinien być bardzo łatwy w obsłudze przez klientów i generatory plików klas.

pisałem to rozwiązanie dla innych, którzy by natknąć się ten problem :)

a przy okazji WSDL i SOAP jest to jeden wielki ból w ....;)

+0

Paweł, dzięki dla odpowiedzi. Myślę, że to typ "mapy" dawał mi problemy. Tablice ciągów nie były dla mnie rozwiązaniem, ponieważ musiałem wysyłać zagnieżdżone złożone dane. W każdym razie nasi klienci .NET korzystają teraz z naszej nowej wersji API, która uprzedza korzystanie z obszarów skojarzonych. – sbleon

Powiązane problemy