Bonjour

Le résultat d'un de mes appels SOAP est toujours à NULL alors que les données transitent bien sur le réseau.

Je pense que c'est parce que l’élément XML retourné a la particularité de n'avoir que des attributs et aucun sous nœud xml.
En effet pour d'autres méthode SOAP le résultat est correct.

Pourriez vous me donner un coup de main ?

Voici la réponse SOAP transmise par le serveur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <context xmlns="urn:zimbra">
      <change token="4"/>
    </context>
  </soap:Header>
  <soap:Body>
      <CreateAppointmentResponse calItemId="259" rev="4" ms="4" invId="259-258" apptId="259" xmlns="urn:zimbraMail"/>
  </soap:Body>
</soap:Envelope>
Et voici mon code en C# où je cherche à récupérer l'élément XML CreateAppointmentResponse et ses attributs (notamment apptId) définis dans le namespace nommé zimbraMail et a priori correct puisque d'autres méthodes SOAP fonctionnent :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
[System.Web.Services.Protocols.SoapHeaderAttribute("contextValue")]
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("urn:zimbraMail/CreateAppointmentRequest", ResponseElementName = "CreateAppointmentResponse", RequestNamespace = "urn:zimbraMail", ResponseNamespace = "urn:zimbraMail", ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped, Use = System.Web.Services.Description.SoapBindingUse.Literal)]
[return: System.Xml.Serialization.XmlElementAttribute("CreateAppointmentResponse")]
public CreateAppointmentResponse CreateAppointmentRequest(Msg m) {
    object[] results = this.Invoke("CreateAppointmentRequest", new object[] { m });
    return ((CreateAppointmentResponse)results[0]);
}
La variable results de type object[] contient un tableau avec un seul objet à NULL.
object[] results n'est pas NULL mais results[0] est NULL.

Je pense que pour avoir une valeur non NULL et castable en CreateAppointmentResponse il faut affiner la ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
[return: System.Xml.Serialization.XmlElementAttribute("CreateAppointmentResponse")]
Qu'en pensez vous ?
J'ai essayé plusieurs alternatives en jouant sur le type de sérialisation XML et le contenu en argument du constructeur, mais sans succès à chaque fois.

Je me demandais également s'il n'existait pas non plus un moyen pour récupérer toute l'enveloppe SOAP au format String.

Victor