bonjour à tous,

après des heures de recherches je craque et j'ose vous importuner avec mon exemple ...

J'ai un serveur SOAP-wsdl en PHP et un client C#.
Le soucis c'est que le serveur doit renvoyer un Array mais que du côté C# c'est reconnu en type object[] en valeur nulle.

Voici les sources:

Le serveur PHP Soap-wsdl :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
 
<?php
require_once("./nusoap-0.7.3/lib/nusoap.php");
$namespace = "http://localhost/SOAP/";
 
// create a new soap server
$server = new soap_server();
// configure our WSDL
$server->configureWSDL("SimpleService");
// set our namespace
$server->wsdl->schemaTargetNamespace = $namespace;
 
 
//===================================[ ResistorTest method ]=============================================================
/**
 * ResistorTest method
 * @param string : numprojet + numligne +  n° de circuit +  resistance
 * @return array : numprojet + numligne +  n° du prochain circuit +  validation test (Continue / Error / Ok)
 */
function ResistorTest($projet, $ligne, $circuit, $resistance) {
 
	// Valeur maxi de tores (circuits) trouvée dans mysql selon l'affaire et ligne:
	$numcircuitmax=6;
 
	// Formate le paramètre $circuit en $numcircuit pour rentrer dans les cas prévus (switch ci-dessous):
	if ($circuit=='None' || $circuit=='') { // Si circuit pas renseigné, renvoie 0 pour sélectionner le 0+1 = 1er circuit à tester
 
		$numcircuit='0';
 
	} else {	// Si circuit bien renseigné
 
				$numcircuit=intval(substr($circuit,-1,1)); // repère le numéro du circuit (dernier caractère du param. $circuit)
 
				if ( !is_numeric($numcircuit) ) { $numcircuit='Error'; } // Si le numéro du circuit n'est pas bien indiqué (et que ce n'est pas None)
 
					else { // Si circuit bien renseigné et dernier caractère numérique
 
							if ($numcircuit==$numcircuitmax){ $numcircuit='Ok'; } // Si Dernier Circuit à tester on renvoie 'Ok' qui signale l'aboutissement des tests.
						}
			}
 
	// Retours de la fonction selon les numcircuits appelés
	switch ($numcircuit) {
 
		case "Error":
			$atester= array('numprojet'=>$projet,'ligne'=>$ligne,'circuit'=>'none','testresult'=>'Error');
			//$atester='none';
			//$atester=serialize($atester);
			return $atester;
		break;
 
		case "Ok":
			$atester= array('numprojet'=>$projet,'ligne'=>$ligne,'circuit'=>'none','testresult'=>'Ok');
			//$atester='none';
			//$atester=serialize($atester);
			return $atester;
		break;
 
 
		default:
			$prochaincircuit=intval($numcircuit)+1;
			//$atester=$projet."**".$ligne."**".'select'.$prochaincircuit."**".$prochaincircuit;
			$atester= array('numprojet'=>$projet,'ligne'=>$ligne,'circuit'=>'select'.$prochaincircuit,'testresult'=>'Continue');
			//$atester=serialize($atester);
			return $atester;
		break;
	}
 
}
 
// register ResistorTest
$server->register(  
               // method name:
                'ResistorTest', 		 
                // parameter list:
                array('projet'=>'xsd:string','ligne'=>'xsd:string','circuit'=>'xsd:string','resistance'=>'xsd:float'), 
                // return value(s):
                array('return'=>'SOAP-ENC:Array'),
				//array('return'=>'xsd:string'),
                // namespace:
                $namespace,
                // soapaction: (use default)
                false,
                // style: rpc or document
                'rpc',
                // use: encoded or literal
                'encoded',
                // description: documentation for the method
                '');				
 
 
 
// Get our posted data if the service is being consumed
// otherwise leave this data blank.                
$POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) 
                ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
 
// pass our posted data (or nothing) to the soap service                    
$server->service($POST_DATA);                
exit();
?>
Pour information, si j'essaie avec
array('return'=>'xsd:Array'),
du côté C# je n'ai qu'un simple String ne contenant que la valeur de ma première colonne de ma table retour.


Et le client C# (j'ai mis le programme dans une petite Form pour faire joli):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
 
namespace TestDuWebServicePHP
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
            Services.SimpleService svc = new Services.SimpleService();
 
            object[] s = svc.ResistorTest(textBox1.Text, textBox2.Text, "tore1", 2);
 
            string sortie = s[2].ToString();
 
            label2.Text = sortie ;
 
        }
    }
}
En mode débeugage j'observe que l'objet "s" est vide, du coup le programme plante à la ligne
string sortie = s[2].ToString();
...

Avec un client PHP je récupère pourtant bien un Array que je peux afficher avec son contenu ..?!

Qu'est-ce qui coince avec le C# ? Comment récupérer proprement un tableau issu d'un serveur SOAP-wsdl PHP ?

Merci pour vos tuyaux car mes recherches googlesques n'ont vraiment rien donné