Je suis en train d'écrire une application .NET 3.5 et j'ai le contrôle sur à la fois le service WCF et le client.
J'utilise svcutil pour générer des classes proxy pour mes services, combinant plusieurs services car ils partagent des types de données.
svcutil /out:ServiceReference.cs /noconfig /namespace:*,Global.ServiceReference
/tcv:Version35 http://localhost:12345/premier.svc http://localhost:12345/deuxieme.svc
Le problème le plus sérieux est l'erreur -- j'ai une classe créée deux fois, ce qui entraîne de nombreuses erreurs de "Ambiguïté entre 'Global.ServiceReference.MyClass.MyField' et 'Global.ServiceReference.MyClass.MyField' ". Notez que pour l'instant, cette classe n'est référencée que dans UN des services, bien qu'à l'avenir elle sera référencée dans d'autres.
Les deux classes générées ressemblent à ceci :
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="MyClass", Namespace="http://schemas.datacontract.org/2004/07/MyService.Util")]
public partial class MyClass : object, System.Runtime.Serialization.IExtensibleDataObject
{
//champs
}
et
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.datacontract.org/2004/07/MyService.Util")]
public partial class MyClass
{
// mêmes champs
}
En se basant sur les attributs qui leurs sont appliqués, cela a quelque chose à voir avec le DataContractSerializer par rapport à XmlSerializer, mais je ne comprends pas vraiment ce que cela signifie.
Un deuxième problème est que svcutil génère un tas d'avertissements du style :
Erreur : Il y a eu une erreur de validation sur un schéma généré lors de l'export :
Source :
Ligne : 1 Colonne : 10415
Erreur de validation : Le simpleType 'http://schemas.microsoft.com/2003/10/Serialization/:guid' a déjà été déclaré.
Ces erreurs se produisent même avec deux services très simples. Par exemple, si le service #1 a
[OperationContract]
public string test(int test)
{
return "test";
}
et le service #2 a
[OperationContract]
public int Ping(string test)
{
return 23;
}
... je reçois les avertissements. Il y en a une centaine, tous se plaignant de divers globalElements, globalAttributes, ou simpleTypes comme guid, duration, char, etc.
Si je change l'un des services pour avoir uniquement des paramètres/retours de type void, je n'obtiens pas les avertissements. C'est vraiment déroutant, car il s'agit du test le plus simple possible. Sans utiliser de types personnalisés du tout, svcutil bloque. Une idée de ce qui se passe ici?