| 

.NET C# Java Javascript Exception

1
Hallo zusammen, ich versuche seit Tagen ein Proxy-Objekt (c#) für den Zugriff auf unser PHP-Webservice zu erstellen. Nach langem Suchen im Internet zum Thema WebServices, WSDL, Soap ... habe ich entschieden einfach ein Proxy zu nutzen weil mir das am einfachsten vorkam.

Jedoch hat das Erstellen mit wsdl.exe nicht geklappt weil ich dort erstens eine Warnung bekomme:
Warnung: Dieser Webverweis entspricht WS-I Basic Profile, Version 1.1, nicht.
R2706: Ein wsdl:binding-Element in einer Beschreibung MUSS den literal-Wert fr das Verwendungsattribut in allen soapbind:body-, soapbind:fault-, soapbind:header- und soapbind:headerfault-Elementen verwenden.
- Das soapbind:body-Eingabeelement des getToken-Vorgangs in portType-Objekt 'TreasuryMonitorBinding' von Namespace 'TreasuryMonitor'.
- Das soapbind:body-Ausgabeelement des getToken-Vorgangs fr das portType-Objekt 'TreasuryMonitorBinding' von Namespace 'TreasuryMonitor'.
- Das soapbind:body-Eingabeelement des getTaskID-Vorgangs in portType-Objekt 'TreasuryMonitorBinding' von Namespace 'TreasuryMonitor'.
- Das soapbind:body-Ausgabeelement des getTaskID-Vorgangs fr das portType-Objekt 'TreasuryMonitorBinding' von Namespace 'TreasuryMonitor'.
- Das soapbind:body-Eingabeelement des login-Vorgangs in portType-Objekt 'TreasuryMonitorBinding' von Namespace 'TreasuryMonitor'.
- Das soapbind:body-Ausgabeelement des login-Vorgangs fr das portType-Objekt 'TreasuryMonitorBinding' von Namespace 'TreasuryMonitor'.
- Das soapbind:body-Eingabeelement des logout-Vorgangs in portType-Objekt 'TreasuryMonitorBinding' von Namespace 'TreasuryMonitor'.
- Das soapbind:body-Ausgabeelement des logout-Vorgangs fr das portType-Objekt 'TreasuryMonitorBinding' von Namespace 'TreasuryMonitor'.
- Das soapbind:body-Eingabeelement des registerProcess-Vorgangs in portType-Objekt 'TreasuryMonitorBinding' von Namespace 'TreasuryMonitor'.
- Das soapbind:body-Ausgabeelement des registerProcess-Vorgangs fr das portType-Objekt 'TreasuryMonitorBinding' von Namespace 'TreasuryMonitor'.

und zweitens ein Fehler:
Fehler: Die Definition für 'TreasuryMonitorBinding' wurde nicht gefunden. Die Diestdefinition mit Namespace '' fehlt.

Ich habe mich auch zu WS-I Basic Profile 1.1 etwas erkundigt aber wieso meine WSDL-Datei nicht WS-I 1.1 konform ist habe ich nicht herausfinden können. Jedenfalls funktioniert der Webservice bereits für PHP-Anwendungen nur das erstellen des Proxy-Objekts für C# klappt bei mir nicht - jedefalls nicht mit wsdl.exe (Dazu evtl. später, will erstmal sichergehen, dass es nicht am Webservice liegt.)
Hier meine WSDL-Datei
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
xmlns:typens="TreasuryMonitor"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="TreasuryMonitor"
name="TRMonitor">
<wsdl:types>
<xsd:schema xmlns=""
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="TreasuryMonitor">
<xsd:complexType name="ArrayOfString">
<xsd:complexContent>
<xsd:restriction base="soapenc:Array">
<xsd:sequence>
<xsd:element name="item" type="xsd:string" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="getTokenRequest">
<wsdl:part name="username" type="xsd:string"/>
<wsdl:part name="password" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="getTokenResponse">
<wsdl:part name="token" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="getTaskIDRequest">
<wsdl:part name="token" type="xsd:string"/>
<wsdl:part name="taskname" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="getTaskIDResponse">
<wsdl:part name="taskid" type="xsd:integer"/>
</wsdl:message>
<wsdl:message name="loginRequest">
<wsdl:part name="token" type="xsd:string"/>
<wsdl:part name="taskid" type="xsd:integer"/>
</wsdl:message>
<wsdl:message name="loginResponse">
<wsdl:part name="scheduleid" type="xsd:integer"/>
</wsdl:message>
<wsdl:message name="logoutRequest">
<wsdl:part name="token" type="xsd:string"/>
<wsdl:part name="scheduleid" type="xsd:integer"/>
</wsdl:message>
<wsdl:message name="logoutResponse">
<wsdl:part name="return" type="xsd:boolean"/>
</wsdl:message>
<wsdl:message name="registerProcessRequest">
<wsdl:part name="token" type="xsd:string"/>
<wsdl:part name="taskname" type="xsd:string"/>
<wsdl:part name="tasktimeout" type="xsd:integer"/>
<wsdl:part name="sms" type="typens:ArrayOfString"/>
<wsdl:part name="mail" type="typens:ArrayOfString"/>
</wsdl:message>
<wsdl:message name="registerProcessResponse">
<wsdl:part name="taskid" type="xsd:integer"/>
</wsdl:message>

<wsdl:portType name="TreasuryMonitorPort">
<wsdl:operation name="getToken">
<wsdl:input message="typens:getTokenRequest"/>
<wsdl:output message="typens:getTokenResponse"/>
</wsdl:operation>
<wsdl:operation name="getTaskID">
<wsdl:input message="typens:getTaskIDRequest"/>
<wsdl:output message="typens:getTaskIDResponse"/>
</wsdl:operation>
<wsdl:operation name="login">
<wsdl:input message="typens:loginRequest"/>
<wsdl:output message="typens:loginResponse"/>
</wsdl:operation>
<wsdl:operation name="logout">
<wsdl:input message="typens:logoutRequest"/>
<wsdl:output message="typens:logoutResponse"/>
</wsdl:operation>
<wsdl:operation name="registerProcess">
<wsdl:input message="typens:registerProcessRequest"/>
<wsdl:output message="typens:registerProcessResponse"/>
</wsdl:operation>
</wsdl:portType>

<wsdl:binding xmlns:ns="blup" name="TreasuryMonitorBinding" type="typens:TreasuryMonitorPort">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getToken">
<soap:operation soapAction="TreasuryMonitor"/>
<wsdl:input>
<soap:body namespace="TreasuryMonitor" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:input>
<wsdl:output>
<soap:body namespace="TreasuryMonitor" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getTaskID">
<soap:operation soapAction="TreasuryMonitor"/>
<wsdl:input>
<soap:body namespace="TreasuryMonitor" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:input>
<wsdl:output>
<soap:body namespace="TreasuryMonitor" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="login">
<soap:operation soapAction="TreasuryMonitor"/>
<wsdl:input>
<soap:body namespace="TreasuryMonitor" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:input>
<wsdl:output>
<soap:body namespace="TreasuryMonitor" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="logout">
<soap:operation soapAction="TreasuryMonitor"/>
<wsdl:input>
<soap:body namespace="TreasuryMonitor" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:input>
<wsdl:output>
<soap:body namespace="TreasuryMonitor" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="registerProcess">
<soap:operation soapAction="TreasuryMonitor"/>
<wsdl:input>
<soap:body namespace="TreasuryMonitor" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:input>
<wsdl:output>
<soap:body namespace="TreasuryMonitor" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TRMonitorService">
<wsdl:port name="TreasuryMonitorPort" binding="TreasuryMonitorBinding">
<soap:address location="http://my.service/service.php"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

Erkennt evtl. jemand den Fehler? Bin für jede Hilfe dankbar.

Gruß
04.08.2011
zmt 13 1 4
zmt 13 1 4
2 Antworten
1
Vielleicht kann ich dir einen Teil deiner Frage beantworten:
Bist du sicher, dass wsdl.exe das richtige Tool für dich ist und nicht evt. svcutil.exe?
Beachte den Unterschied zwischen Web Reference und Service Reference:
The Difference Between “Add Web Reference” and “Add Service Reference”
04.08.2011
Jürgen Luhr 7,1k 2 9
0
Danke für die schnelle antwort, ich habe es auch vorher schon mit svcutil versucht da wird auch der Proxy erstellt aber der Fehler taucht trotzdem auf.
Warnung für benutzerdefiniertes Tool: wsdl:port kann nicht importiert werden.
Detail: Die Definition für 'TreasuryMonitorBinding' wurde nicht gefunden. Die Dienstdefinition mit Namespace '' fehlt.
Parametername: name
XPath zur Fehlerquelle: //wsdl:definitions[@targetNamespace='TreasuryMonitor']/wsdl:service[@name='TRMonitorService']/wsdl:port[@name='TreasuryMonitorPort']

Ergänzung: Wenn ich den Dienstverweis (so heißt es wohl bei Visual Studio 2008) in VS direkt einbinde tuacht die gleiche Meldung als Warnung auf.

Gruß
04.08.2011
zmt 13 1 4
zmt 13 1 4
Feedback: Ich vermute mal, dass die Warnung (beim Ausführen der svcutil.exe wird die selbe Meldung als fehler angezeigt) dadurch zustande kommt, dass im <wsdl:service>-element kein Namespace angegeben ist.
Würde auch erklären wieso in der erzeugten app.config kein tag für die Endpointadrese generiert wird.
Jedenfalls habe ich die Warnung ignoriert und die Endpointadresse manuel eingetragen und es funktioniert.

Gruß zmt
zmt 05.08.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH