[WSDL C# & PHP] C# kan de webservice niet aanroepen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mede-auteur:
  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 00:53

Avalaxy

Momenteel heb ik een webservice door middel van SOAP draaien met een php achtergrond. Zodra ik deze aanroep door middel van c# wordt hij (toegevoegd als web reference) herkent, zie ik het juiste aantal argumenten met de juiste types en wordt de return value (boolean) goed weergegeven.
Als ik hem dan echter aanroep vanuit mijn code geeft visual studio aan dat er een extra argument moet worden meegegeven.
Dit argument is een boolean, de naam ervan is het 3e argument wat ik meegeef (ahobid) met erachter specified, oftewel ahobidspecified. Waar deze vandaan komt is onbekend.
C#:
1
2
3
Soapie.soapService x = new Soapie.soapService();
                Boolean z = x.insert("test", "hashtest", 5, true, "test");
                Console.WriteLine(z);

wsdl(excuses voor de lengte):
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://145.53.86.72/collector/service.wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://145.53.86.72/collector/service.wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://145.53.86.72/collector/service.wsdl">
      <s:element name="insertRequest">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="data" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="hash" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="ahobcode" type="s:int" />
            <s:element minOccurs="0" maxOccurs="1" name="iv" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="insertResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="result" type="s:boolean" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </wsdl:types>
  <wsdl:message name="insertRequest">
    <wsdl:part name="parameters" element="tns:insertRequest" />
  </wsdl:message>
  <wsdl:message name="insertResponse">
    <wsdl:part name="parameters" element="tns:insertResponse" />
  </wsdl:message>
  <wsdl:portType name="servicePortType">
    <wsdl:operation name="insert">
      <wsdl:input message="tns:insertRequest" />
      <wsdl:output message="tns:insertResponse" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="serviceBinding" type="tns:servicePortType">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="insert">
      <soap:operation soapAction="http://145.53.86.72/collector/insertRequest" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="soapService">
    <wsdl:port name="servicePort" binding="tns:serviceBinding">
      <soap:address location="http://145.53.86.72/collector/Server.php" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>


De writeline geeft continue een false weer (overigens zal hij niet snel een true weer gaan geven aangezien het om encryptie gaat en hij uiteraard moeilijk dit als goede encryptie kan zien).
Wat het probleem echter is, nadat ik als vervangend argument voor ahobidspecified een true meegeef (zonder dat deze strikt noodzakelijk is), is dat in de error log van apache komt.

[Tue Dec 07 17:45:05 2010] [error] [client 10.10.10.10] PHP Warning: Missing argument 2 for Server::insert() in /var/www/collector/Server.php on line 31
[Tue Dec 07 17:45:05 2010] [error] [client 10.10.10.10] PHP Warning: Missing argument 3 for Server::insert() in /var/www/collector/Server.php on line 31
[Tue Dec 07 17:45:05 2010] [error] [client 10.10.10.10] PHP Warning: Missing argument 4 for Server::insert() in /var/www/collector/Server.php on line 31

Zoals je hier ziet herkent hij op de een of andere manier het 2e, 3e en 4e argument niet die ik volgens mij correct meegeef. Hij geeft niet weer dat de boolean sowieso een probleem oplevert.

Ik zit hiermee met mijn handen in het haar.
Heel Google afgestruint, meerdere wsdl's geprobeerd, verschillende visual studio installaties geprobeerd, argumenten weggehaald en toegevoegd, maar de fout met meerdere argumenten meegeven blijft plus de ahobidspecified blijft terugkomen.

Mochten jullie enig inzicht kunnen bieden, barst los.

Acties:
  • 0 Henk 'm!

Verwijderd

Gezien je een complextype gebruikt als parameter van je operation zal je in PHP maar 1 argument in je functie moeten hebben.

In PHP zal dit object hoogstwaarschijnlijk een stdClass object zijn met de properties die gespecificeerd zijn in je WSDL.

Daarnaast zie ik iets vreemds in je wsdl / code, je complextype heeft 4 properties en in C# geef je er 5 mee ?

Acties:
  • 0 Henk 'm!

  • decipherer
  • Registratie: Februari 2002
  • Laatst online: 22:29
Het derde argument in je wsdl is van type int waarbij je aangeeft dat deze niet verplicht is (minoccurs = 0). Int is echter een value type, dus heeft C# dat laatste argument (ahobidspecified) nog nodig om te bepalen of je hem al dan niet mee wil geven aan de method call.

[ Voor 5% gewijzigd door decipherer op 08-12-2010 15:53 ]

De beste ideeën komen als je bezig bent.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
decipherer schreef op woensdag 08 december 2010 @ 15:51:
Het derde argument in je wsdl is van type int waarbij je aangeeft dat deze niet verplicht is (minoccurs = 0). Int is echter een value type, dus heeft C# dat laatste argument (ahobidspecified) nog nodig om te bepalen of je hem al dan niet mee wil geven aan de method call.
Ah dat verklaart in ieder geval de rare waarde die erbij komt. Heb je hiervoor misschien wat achtergrond materiaal? Ben het zelf nog niet eerder tegengekomen (ben dan ook nog maar net met c# bezig).
Verwijderd schreef op woensdag 08 december 2010 @ 09:43:
Gezien je een complextype gebruikt als parameter van je operation zal je in PHP maar 1 argument in je functie moeten hebben.

In PHP zal dit object hoogstwaarschijnlijk een stdClass object zijn met de properties die gespecificeerd zijn in je WSDL.

Daarnaast zie ik iets vreemds in je wsdl / code, je complextype heeft 4 properties en in C# geef je er 5 mee ?
De php kant van dit verhaal is van iemand anders(Avalaxy), hij is er als het goed is mee bezig, heb nog geen reactie van hem gehad dus weet niet exact hoever hij is, hij heeft dit gelezen en is ermee aan de slag.
Dat ik 4 properties heb en in c# 5 argumenten meegeef legt decipherer uit onder jouw post.

Nu even Avalaxy afwachten...

Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 00:53
Ik heb de WSDL aangepast zodat de parameters op minOccurs=1 staan en de functie in PHP aangepast zodat hij nog maar 1 parameter slikt (een object waar ik de parameters weer uithaal). Dit ziet er zo uit:

PHP:
1
2
3
4
5
6
7
8
9
function insert($oData) {
        $this->aValues = get_object_vars($oData);
        $this->sData = $this->aValues['data'];
        $this->sHash = $this->aValues['hash'];
        $this->iAhobId = $this->aValues['ahobcode'];
        $this->sIv = $this->aValues['iv'];

        // ...snip...
}


Ik krijg in Visual Studio nu in ieder geval gewoon 4 parameters ipv 5, en het connecten gaat zo te zien prima :) Of er ook daadwerkelijk waardes in m'n array zitten weet ik nog niet... Vandaag of morgen even verder met unit testen en dan laat ik het hier wel weten.