Bonjour,
J'essaie de consommer un service web PHP en .NET.
Ce dernier expose une méthode ProcessComplexType qui retourne un objet de type ComplexTypeSample.
Je précise que je n'utilise pas et ne souhaite pas utiliser la génération de code avec l'ajout d'une référence de service.
Voilà mon contrat:
1 2 3 4 5 6 7 8
|
[ServiceContract(Namespace = "http://www.ComplexTypeService.com")]
public interface IComplexTypeService
{
[OperationContractAttribute]
[return: MessageParameterAttribute(Name = "return")]
ComplexTypeSample ProcessComplexType(string expression);
} |
Le type ComplexTypeSample:
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
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;
namespace Service.Entities
{
[DataContract]
public class ComplexTypeSample
{
private string _string1;
private int _number1;
[DataMember(Name = "string1")]
public string string1
{
get
{
return _string1;
}
set
{
_string1 = value;
}
}
[DataMember(Name = "number1")]
public int number1
{
get
{
return _number1;
}
set
{
_number1 = value;
}
}
public override string ToString()
{
return string1 + ": " + number1;
}
}
} |
Enfin le programme principal:
1 2 3 4 5 6 7 8 9 10 11
|
BasicHttpBinding binding2 = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
EndpointAddress endPointAddr2 = new EndpointAddress("http://localhost/complexType.service.php");
IComplexTypeService testService2 = new ChannelFactory<IComplexTypeService>(binding2, endPointAddr2).CreateChannel();
Service.Entities.ComplexTypeSample result = testService2.ProcessComplexType("Hello, 27");
if (result == null)
Console.WriteLine("Echec: la méthode 'ProcessComplexType' a retourné null.");
else
Console.WriteLine("Chaîne: '" + result.string1 + "'" + Environment.NewLine + "Nombre: '" + result.number1 + "'" );
Console.ReadKey(); |
Avec fiddler, je vois bien passer les données:
1 2
|
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope 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><ProcessComplexTypeResponse xmlns="http://www.ComplexTypeService.com"><return><number1>27</number1><string1>Hello</string1></return></ProcessComplexTypeResponse></SOAP-ENV:Body></SOAP-ENV:Envelope> |
Pourtant, le programme m'affiche:
1 2 3
|
Chaîne: ''
Nombre: '0' |
Les champs de ComplexTypeSample ne sont pas initialisés. Notez que si je retire la ligne
[return: MessageParameterAttribute(Name = "return")]
du contrat, je récupère toujours une valeur null.
Le problème se situe au moment de la désérialisation. Il recupère bien l'élément 'return' mais ne le désérialise pas dans ComplexTypeSample...
Quelqu'un saurait-il pourquoi ?
Merci d'avance pour toute aide, je bloque là dessus depuis un bon moment...
Bonne journée/soirée
Partager