7 votes

Erreurs/Avertissements lors de l'utilisation de svcutil.exe pour créer des classes proxy pour plusieurs services WCF

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?

3voto

alexdej Points 2457

Quelque chose dans les fichiers XSD cause svcutil à invoquer XmlSerializer pour générer certains de vos types. Malheureusement, le partage de types entre DataContract et XmlSerializer n'est pas disponible, donc vous vous retrouvez avec des types dupliqués. Comme il semble que vous utilisiez probablement DC exclusivement sur le serveur, il pourrait suffire de forcer svcutil à rester en mode DC et à ne pas passer à XmlSerializer, comme ceci :

svcutil /serializer:DataContractSerializer ...

1voto

rerun Points 15285

Les avertissements sont normaux lorsque vous partagez des types et répertoriez plusieurs services J'utilise cette méthode depuis plus d'un an. L'utilitaire génère-t-il la classe ou ne crée-t-il rien du tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X