Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

C# SOAP resultaat deserializen.

Pagina: 1
Acties:

  • Peunage
  • Registratie: Februari 2009
  • Laatst online: 21-11 10:06
Ik heb een SOAP service draaien door middel van PHP (NuSOAP). Nu probeer ik deze service aan te spreken door middel van een C# windows form in Visual Studio Express 2013. Ik krijg echter steeds deze foutmelding;
code:
1
2
An unhandled exception of type 'System.ServiceModel.CommunicationException' occurred in mscorlib.dll
Additional information: Error in deserializing body of reply message for operation 'getRoomsInfo'.


Dit is het PHP script. getRoomsInfo geeft een Array terug en ik denk dat daar het probleem zit. Wanneer ik hier een string van maak krijg ik geen foutmelding meer, maar dan kan ik ook niks meer met het resultaat doen in C#.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
require('lib/nusoap.php');
require('functions.php');
    $server = new nusoap_server();
    $server->configureWSDL("home_auto");

    $server->register(
                "getRoomsInfo", //name of methdod
            array(),    //input
        array("result"=>"xsd:Array")         //output
    );

    $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
    $server->service($HTTP_RAW_POST_DATA);



Ik heb SOAPUI even gebruikt om te kijken wat deze functie nou precies terug geeft, en dit is het resultaat;

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
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
      <ns1:getRoomsInfoResponse xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/">
         <result xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="unnamed_struct_use_soapval[4]">
            <item>
               <name xsi:type="xsd:string">room 1</name>
               <__numeric_0 xsi:type="xsd:string">room 1</__numeric_0>
               <door xsi:type="xsd:string">door_closed.png</door>
               <__numeric_1 xsi:type="xsd:string">door_closed.png</__numeric_1>
               <light xsi:type="xsd:string">light_off.png</light>
               <__numeric_2 xsi:type="xsd:string">light_off.png</__numeric_2>
            </item>
            <item>
               <name xsi:type="xsd:string">room 2</name>
               <__numeric_0 xsi:type="xsd:string">room 2</__numeric_0>
               <door xsi:type="xsd:string">door_closed.png</door>
               <__numeric_1 xsi:type="xsd:string">door_closed.png</__numeric_1>
               <light xsi:type="xsd:string">light_off.png</light>
               <__numeric_2 xsi:type="xsd:string">light_off.png</__numeric_2>
            </item>
            <item>
               <name xsi:type="xsd:string">room 3</name>
               <__numeric_0 xsi:type="xsd:string">room 3</__numeric_0>
               <door xsi:type="xsd:string">door_closed.png</door>
               <__numeric_1 xsi:type="xsd:string">door_closed.png</__numeric_1>
               <light xsi:type="xsd:string">light_on.png</light>
               <__numeric_2 xsi:type="xsd:string">light_on.png</__numeric_2>
            </item>
            <item>
               <name xsi:type="xsd:string">room 4</name>
               <__numeric_0 xsi:type="xsd:string">room 4</__numeric_0>
               <door xsi:type="xsd:string">door_closed.png</door>
               <__numeric_1 xsi:type="xsd:string">door_closed.png</__numeric_1>
               <light xsi:type="xsd:string">light_off.png</light>
               <__numeric_2 xsi:type="xsd:string">light_off.png</__numeric_2>
            </item>
         </result>
      </ns1:getRoomsInfoResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

  • diabolofan
  • Registratie: Mei 2009
  • Laatst online: 13-11 08:57
En dan nu graag de relevante C# code waar het misgaat...

  • Peunage
  • Registratie: Februari 2009
  • Laatst online: 21-11 10:06
diabolofan schreef op woensdag 22 oktober 2014 @ 22:29:
En dan nu graag de relevante C# code waar het misgaat...
Oh, natuurlijk. Ik heb ten eerste een service reference toegevoegd aan het project, met een link naar de WSDL en zo.

Dit is de code waar het vervolgens om gaat, het aanroepen van getRoomsInfo;

C#:
1
2
3
4
private void roomInfo(){
      home_autoPortTypeClient roomInfo = new home_autoPortTypeClient();
      roomInfo.getRoomsInfo();
}


Zoals je ziet doe ik nog niks met het resultaat, ik roep alleen de methode/functie aan.

[ Voor 7% gewijzigd door Peunage op 22-10-2014 22:44 ]


  • Merethil
  • Registratie: December 2008
  • Laatst online: 21:36
Peunage schreef op woensdag 22 oktober 2014 @ 22:43:
[...]


Oh, natuurlijk. Ik heb ten eerste een service reference toegevoegd aan het project, met een link naar de WSDL en zo.

Dit is de code waar het vervolgens om gaat, het aanroepen van getRoomsInfo;

C#:
1
2
3
4
private void roomInfo(){
      home_autoPortTypeClient roomInfo = new home_autoPortTypeClient();
      roomInfo.getRoomsInfo();
}


Zoals je ziet doe ik nog niks met het resultaat, ik roep alleen de methode/functie aan.
Het zouden een paar dingen kunnen zijn.
Een simpele google-search geeft deze link: http://stackoverflow.com/...r-operation-for-every-met

Wat het ook zou kunnen zijn is dat je een deserializer moet maken voor de specifieke items die in de SOAP response zitten. Zo te zien heb je vanuit PHP een array van objecten die je uitlevert aan via de SOAP return-waarde, maar C# kan daar niets van maken (aka niet deserializen naar een object in C#).
In dit geval zou je dan kunnen kijken naar óf een deserializer bouwen voor jouw specifieke doeleinden (kan je laten genereren denk ik, ben niet zo bekend met SOAP op C#.NET verder), of je data op een andere manier doorsturen, zoals bijvoorbeeld in een SOAP-formaat met valide SOAP-variables.