Bonjour à tous,

Ayant participé à un développement de web-services WCF, je suis maintenant à la place du développeur côté client.
Voici mon contexte, gardez à l'esprit que j'ai la main sur le code client comme sur le code serveur :
- WCF
- .NET 4.0
- C#

J'ai à ma disposition un ensemble de méthodes sur un seul webservice (environ 300)
Nombre de ces méthodes sont générés via un outil custom, qui utilise Nhibernate et génere directement les contrats, méthodes, opérations, sur chaque table d'une base de données.

COTÉ SERVEUR :

Exemple dans mon wsdl d'une de ces méthodes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
<wsdl:message name="GetTableNameRequest"><wsdl:part name="parameters" element="tns:GetTableNameRequest"/></wsdl:message>
Dans mon code C#, toutes les operations sont dans le même namespace physique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
        // Signature of the method GetTableNameRequest
        // This is what will be display in the wsdl file (name of the webservice method)
        [OperationContract(Action = "GetTableNameRequest")]
        GetTableNameResponse GetTableName(GetTableNameRequest request);
Il en est de même pour mes classes de message ...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
  /* -------------------- MESSAGE CLASS -------------------- */
    [DataContract(Name = "Shop")]
    public class MyShop: IExtensibleDataObject, IEquatable<MyShop>
    {
        /// <summary>
        /// Shop Identifier (Primary Key)
        /// </summary>
        [DataMember(Name = "PrimaryKey", Order = 1)]
        public long _primaryKey;
Cette classe message porte le datacontract name "Shop", pour être identifiés par cette chaine côté client.
J'ai d'autres web-methods qui renvoient un objet portant le datacontract name "Shop", différent de celui (pas exactement les mêmes membres de classe).

COTÉ CLIENT :

Et c'est là qu'est mon problème.
Lorsque je suis dans une autre solution VisualStudio, et que je me place comme client des webservices, j'ajoute une service reference sur le webservice serveur ci-dessus.
SVCUTIL.exe me génere une classe Reference.cs qui contient TOUTES mes méthodes, et ce, dans le meme namespace.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="Shop", Namespace="http://schemas.datacontract.org/2004/07/MyService")]
    [System.SerializableAttribute()]
    public partial class Shop: object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
 
        [System.NonSerializedAttribute()]
        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
 
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private long PrimaryKey
 
[...]
Ce qui me pose problème : L'objet géneré par SVCUTIL ci-dessus (MyShop), peut se trouver dans plusieurs méthodes avec une structure différente. Quand SVCUTIL genere mon ensemble de classes, tout est dans le même namespace et ça donne :

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
 
System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="Shop", Namespace="http://schemas.datacontract.org/2004/07/MyService")]
    [System.SerializableAttribute()]
    public partial class Shop 
[...]
 
System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="Shop", Namespace="http://schemas.datacontract.org/2004/07/MyService")]
    [System.SerializableAttribute()]
    public partial class Shop1
[...]
System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="Shop", Namespace="http://schemas.datacontract.org/2004/07/MyService")]
    [System.SerializableAttribute()]
    public partial class Shop2
[...]

Ce qui est très sale à mon sens. Ce que je souhaiterais côté client, c'est avoir quelque chose du style :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
namespace WebMethods.CustomMethodShop 
{
    object Shop
}
 
namespace WebMethods.CustomMethodOtherShop 
{
    object Shop
}
etc ...

... que le client puisse simplement trouver ses objets.

Plusieurs questions :
- Y-a t'il une manière simple d'isoler mes objets qui ont le même datacontract ?
- Est-ce possible via les namespace ?
- Dois-je implémenter du code côté serveur pour forcer SVCUTIL à comprendre qu'il me faut plusieurs namespace ?

D'avance, merci de votre compréhension.
Bien évidemment, si quelque chose n'est pas clair, je peux vous apporter des précisions.