Erreur de référence de service: impossible de générer le code pour la référence de service

J’ai une solution de service Windows et j’essaie d’append une référence de service à un service Web Hermes (serveur de messagerie opensource ebms) dans VS2010.

Je peux trouver le service Web en utilisant son URL, mais lorsque j’essaie de remplir la référence de service, j’obtiens les erreurs suivantes dans Visual Studio:

Error 8 Custom tool error: Failed to generate code for the service reference 'testService'. Please check other error and warning messages for details. C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler Warning 6 Custom tool warning: Cannot import wsdl:binding Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on. XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery'] XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler Warning 7 Custom tool warning: Cannot import wsdl:port Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on. XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery'] XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:service[@name='EbmsMessageStatusQuery']/wsdl:port[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler Warning 5 Custom tool warning: Cannot import wsdl:portType Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.XmlSerializerMessageContractImporter Error: Schema with target namespace 'http://service.ebms.edi.cecid.hku.hk/' could not be found. XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler 

Certaines recherches semblaient suggérer que svcutil.exe n’était pas capable de construire les proxys car il ne disposait pas des permissions nécessaires pour accéder à un répertoire (éventuellement c: \ windows \ temp). J’ai essayé d’atsortingbuer diverses permissions d’access, mais je ne suis pas vraiment sûr de quel utilisateur a besoin de cette autorisation ou s’il ne s’agit que d’un hareng rouge.

Toutes les idées seraient grandement appréciées.

Merci

Vous devez désélectionner les types de réutilisation dans tous les assemblys référencés à partir de l’option Configurer une référence de service.

Vérifiez cela pour plus de détails

Cliquez avec le bouton droit sur votre référence de service et choisissez Configure Service Reference...

Configurer la référence de service

Désélectionnez ensuite les Reuse types in referenced assemblies

Types de réutilisation

Cliquez sur OK , nettoyez et recréez votre solution.

J’ai également rencontré une erreur similaire lors de la tentative de génération du client pour un service Web à partir d’un projet ASP .Net MVC 4.0 à l’aide de Visual Studio 2012.

La racine du problème semble être le fait que le projet à partir duquel j’essayais de générer le client faisait référence à un assembly qui, à son tour, dépendait d’un autre assembly qui n’était pas non plus référencé.

Lorsque “Réutiliser les types dans les assemblys référencés” est activé dans la configuration du service, le générateur de service inspecte probablement tous les assemblys référencés pour obtenir une liste des types pouvant être réutilisés. Le fait que l’un des assemblys référencés fasse référence à un autre assemblage qui n’est pas disponible est probablement à l’origine de la défaillance du générateur.

Décocher “Réutiliser les types dans les assemblys référencés” à partir des configurations de service résoudra le problème ci-dessus , mais il y a un effet secondaire. L’option de réutilisation des types est là pour une raison et dans certains cas, elle évite la conversion inutile dans le code consommant le service.

Par exemple, si le service lui-même est créé à l’aide de WCF et que certains parameters de méthodes qu’il contient sont de type System.Guid, ils seront convertis en chaînes dans le client généré si l’option des types de réutilisation est désactivée.

Une alternative que je préfère désactiver les types de réutilisation consiste à append la référence de service du projet de bibliothèque de classes spécifiquement créé à cet effet. La seule chose à garder à l’esprit est de copier toutes les configurations liées au service depuis le fichier app.config de la bibliothèque de classes vers le fichier de configuration du projet de démarrage.

S’il existe des types définis dans les assemblys locaux qui doivent être réutilisés dans le client de service, ces assemblys doivent simplement être référencés à partir du projet de bibliothèque de classes mentionné ci-dessus, avec toutes leurs dépendances.

http://uliasz.com/2011/06/wcf-custom-tool-error-failed-to-generate-code-for-the-service-reference/#comment-1647

Merci à l’article ci-dessus.

Dans mon cas, j’ai ce problème avec mon projet WPF dans VS.Net 2008. Après avoir parcouru cet article, je me suis rendu compte que l’assembly utilisé dans le service Web est une version d’assembly différente utilisée sur le client.

Cela fonctionne très bien après la mise à jour de l’assemblage sur le client.

Il serait extrêmement difficile de deviner le problème car il est dû à une erreur dans le WSDL et sans examiner le WSDL, je ne peux pas en dire plus. Donc, si vous pouvez partager votre WSDL, veuillez le faire.

Tout ce que je peux dire, c’est qu’il semble y avoir un schéma manquant dans le WSDL (avec l’espace de noms cible «http://service.ebms.edi.cecid.hku.hk/»). Je connais les problèmes et la gestion différente du schéma lorsque les instructions include sont ignorées.

En général, j’ai trouvé que la mise en œuvre des services Web par Microsoft était plutôt bonne, donc je pense que le service Web renvoie des données WSDL douteuses.

J’ai la même erreur dans Silverlight 5 (VS2012)

Vous pouvez également supprimer les références à:

  • System.ServiceModel.DomainServices.Client
  • System.ServiceModel.DomainServices.Client.Web

Après avoir mis à jour les références de service, assurez-vous de les append à nouveau.

Comme indiqué ci-dessus, il existe plusieurs problèmes différents possibles. Nous avons trouvé que le fichier .DLL de la bibliothèque WCF avait été ajouté en tant que référence au projet client. Cela, à son tour, a créé des problèmes avec la résolution des objects et a donc provoqué le “vidage” des fichiers par des étapes de génération de code. Si décocher l’utilisation de “Types de réutilisation …” peut sembler être une réponse, cela crée des définitions supplémentaires de types d’object, qui sont des proxies aux types réels, dans un nouvel espace de nom, ce qui entraîne tous les problèmes de “compatibilité” avec l’utilisation de ces types. Seulement si vous voulez vraiment “cacher” un type, cochez cette option.

Cacher le type serait approprié lorsque vous ne voulez pas qu’une dépendance de type “DLL” “fuie” dans un projet que vous essayez de garder séparé des autres. Si la DLL du projet de bibliothèque WCF s’insère dans les références du projet client, vous rencontrerez ce problème avec toutes sortes d’effets secondaires étranges, car les définitions de type sont également dans la DLL.

faire face au même problème, résolu en exécutant Visual Studio en mode Admin

J’ai rencontré ce problème lors de la mise à niveau d’une solution VS2010 WCF + Silverlight dans VS2015 Professional . Outre la mise à niveau automatique de Silverlight 4 vers Silverlight 5, la valeur de la case à cocher de réutilisation de la référence de service a été modifiée et la génération a échoué.

“Réutiliser les types” n’est pas toujours le problème lorsque cette erreur se produit.

Lorsque vous ajoutez une référence à un service plus ancien, cliquez sur “Avancé” et cliquez sur “Ajouter une référence Web”. Maintenant, connectez-vous à votre wsdl et tout devrait fonctionner.

J’ai eu ce problème en essayant de mettre à jour ma référence de service (l’erreur n’apparaît que lors de l’ajout d’une référence de service), mais je ne voulais pas supprimer la case à cocher de réutilisation d’assemblage.

Ce qui a fonctionné pour moi était le suivant:

  • Supprimer l’assembly référencé que je voulais réutiliser
  • Mettre à jour la référence du service
    • Conserver “Types de réutilisation dans les assemblys référencés spécifiés”
    • Ignorer les erreurs, c’est que la référence est manquante!
  • Ajouter une référence à l’assembly à nouveau pour corriger les erreurs
  • Mettre à jour la référence de service à nouveau

Voila, maintenant, il met à jour et n’essaie plus de supprimer tout mon code généré.

J’étais presque prêt à abandonner la fonctionnalité des types de réutilisation …

Si vous souhaitez corriger cela sans décocher la case à cocher de réutilisation des assemblages, voici ce qui a fonctionné pour moi:

  • Supprimer l’assembly référencé que vous souhaitez réutiliser
  • Supprimer tout le dossier bin du projet
  • Mettre à jour la référence du service
    • Conserver “Types de réutilisation dans les assemblys référencés spécifiés”
  • Ajouter une référence à l’assembly à nouveau pour corriger les erreurs
  • Mettre à jour la référence de service à nouveau

Redémarrer Visual Studio a fait l’affaire pour moi. J’utilise VS 2015.