Bonjour,
Je vous poste un petit souci que j'ai rencontré récemment dans un de mes webservice. Il y a une différence entre la signature de la méthode que je déclare en tant que webmethod, et la signature de la méthode que j'obtiens en consommant le webservice
Petite explication pour y voir plus clair
Je dispose d'une classe sérialisable qui possède comme seule propriété un tableau de type complexe :
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
|
namespace Atome.BusinessServices.ODO.TopExpert {
using System.Xml.Serialization;
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.company.fr/TopExpert.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.company.fr/TopExpert.xsd", IsNullable = false)]
public partial class ListeTopExperts {
private TopExpert[] topExpertField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("TopExpert")]
public TopExpert[] TopExpert {
get {
return this.topExpertField;
}
set {
this.topExpertField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.company.fr/TopExpert.xsd")]
public partial class TopExpert {
private TopExpertAction actionField;
private TopExpertInfoAgence infoAgenceField;
private TopExpertProfil profilField;
/// <remarks/>
public TopExpertAction Action {
get {
return this.actionField;
}
set {
this.actionField = value;
}
}
/// <remarks/>
public TopExpertInfoAgence InfoAgence {
get {
return this.infoAgenceField;
}
set {
this.infoAgenceField = value;
}
}
/// <remarks/>
public TopExpertProfil Profil {
get {
return this.profilField;
}
set {
this.profilField = value;
}
} |
La signature de ma méthode de ws est la suivante :
public IntegrationReport UpdateProfile(ListeTopExperts tp)
Je m'attends donc sur la wsdl à retrouver ma classe "ListeTopExpert" en paramètre de méthode :
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
| <s:schema elementFormDefault="qualified" targetNamespace="http://www.company.fr/TopExpert.xsd">
<s:import namespace="http://www.company.fr/integration_report"/>
<s:element name="UpdateProfile">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="ListeTopExperts" type="tns:ListeTopExperts"/>
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ListeTopExperts">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="TopExpert" type="tns:TopExpert"/>
</s:sequence>
</s:complexType>
<s:complexType name="TopExpert">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Action" type="tns:TopExpertAction"/>
<s:element minOccurs="0" maxOccurs="1" name="InfoAgence" type="tns:TopExpertInfoAgence"/>
<s:element minOccurs="0" maxOccurs="1" name="Profil" type="tns:TopExpertProfil"/>
</s:sequence>
</s:complexType> |
Jusque là je peux a priori dire "normal".
Là où je ne comprends plus rien c'est que lorsque je consomme le webservice (avec donc un autre projet), je me retrouve avec la signature de méthode suivante.
1 2 3 4 5
|
/// <remarks/>
public void UpdateProfileAsync(TopExpert[] ListeTopExperts) {
this.UpdateProfileAsync(ListeTopExperts, null);
} |
Le type "ListeTopExpert" a disparu, il a en quelque sorte été remplacé par le type de la seule propriété qui existait dans ListeTopExpert.
J'ai donc vérifié en refaisant la publication/consommation avec une propriété de plus dans ma classe ListeTopExpert, et là miracle dans la webreference, je n'ai plus en paramètres un "TopExpert[]" mais un objet de type "ListeTopExpert"
Donc j'aimerais comprendre pourquoi il me génère des raccourcis de type que je ne lui demande pas, quand il n'y a qu'un seul élément à la racine de l'objet sérialisable?
Et plus avant, y a-t-il un moyen de déclarer ma classe sérialisable de façon à ce que je n'ai pas à rajouter un élément bidon (qui est une solution, assez horrible a mes yeux^^) pour que la signature de la méthode consommée corresponde à la méthode déclarée?
Note :
Les webservices ont été crées et compilés, déployés, avec VS2005 sous WSE 3.0 (tout ca en laissant VS2005 s'occuper de tout).
La classe sérialisable a été générée par xsd.exe dont voici le bout du xsd concerné :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <xs:schema targetNamespace="http://www.company.fr/TopExpert.xsd" xmlns="http://www.company.fr/TopExpert.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified">
<xs:element name="ListeTopExperts" type="ListeTopExperts" />
<xs:complexType name="ListeTopExperts">
<xs:sequence minOccurs="1">
<xs:element name="TopExpert" type="TopExpert" minOccurs="1" maxOccurs = "unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="TopExpert">
<xs:sequence>
<xs:element name="Action" minOccurs="1" maxOccurs="1" type="TopExpertAction"/>
<xs:element name="InfoAgence" minOccurs="1" maxOccurs="1" type="TopExpertInfoAgence"/>
<xs:element name="Profil" minOccurs="1" maxOccurs="1" type="TopExpertProfil"/>
</xs:sequence>
</xs:complexType> |
Voila donc si vous avez des idées, je suis preneur
En vous remerciant,
Misdrhaal
Partager