web-dev-qa-db-fra.com

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'ajouter une référence de service à un service Web Hermes (serveur de messages ebms Opensource) dans VS2010.

Je peux trouver le service Web en utilisant son URL, mais lorsque j'essaie de renseigner la référence de service, les erreurs suivantes apparaissent 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

Une enquête a semblé suggérer que c'est en raison de svcutil.exe qui n'a pas été en mesure de créer les serveurs proxy en raison de l'absence d'autorisations sur un répertoire (éventuellement c:\windows\temp). J'ai essayé d'attribuer diverses autorisations d'accès, mais je ne sais pas vraiment quel utilisateur a besoin de cette autorisation ni s'il s'agit simplement d'un faux-plongeon.

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

Merci

130
jheppinstall

Désélectionnez les types de réutilisation dans tous les assemblys référencés dans l'option Configurer la référence de service.

Cochez cette case pour plus de détails

295
smhnkmr

Faites un clic droit sur votre référence de service et choisissez Configure Service Reference...

Configure Service Reference

Puis décochez Reuse types in referenced assemblies

Reuse Types

Cliquez sur OK, nettoyez et reconstruisez votre solution.

122
Darren

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 utilisant Visual Studio 2012.

La racine du problème semble être le fait que le projet d'où j'essayais de générer le client faisait référence à une assemblée qui dépendait à son tour d'une autre assemblée qui n'était pas également référencée.

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 assemblages référencés" dans les configurations de service résoudra le problème ci-dessus, mais cela aura un effet secondaire. L'option types de réutilisation existe pour une raison et évite dans certains cas de transtyper inutilement le code consommant le service.

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

ne alternative que je préfère pour désactiver les types de réutilisation consiste à ajouter la référence de service à partir du projet de bibliothèque de classes créé spécifiquement à cette fin. N'oubliez pas de copier toutes les configurations liées au service depuis le fichier app.config de la bibliothèque de classes dans le fichier de configuration du projet de démarrage.

Si des types définis dans des assemblys locaux doivent être réutilisés dans le client de service, il suffit simplement de référencer ces assemblys à partir du projet de bibliothèque de classes susmentionné, ainsi que de toutes leurs dépendances.

16

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 lu cet article, je me rendais compte que Assembly utilisé dans le service Web est une version différente de Assembly utilisée sur le client.

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

3
user2144589

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 saurais 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 suis au courant des problèmes rencontrés et du traitement différent du schéma lorsque les instructions d'inclusion sont ignorées.

En règle générale, la mise en œuvre des services Web par Microsoft est plutôt bonne. Je pense donc que le service Web renvoie des fichiers WSDL douteux.

1
Aliostad

Si vous voulez corriger cela sans décocher la case à cocher Réutiliser l'assemblage, voici ce qui a fonctionné pour moi:

  • Supprimer l'assemblage référencé que vous souhaitez réutiliser
  • Supprimer tout le dossier bin du projet
  • Mettre à jour la référence de service
    • Conserver "les types de réutilisation dans les assemblys référencés spécifiés"
  • Ajoutez à nouveau une référence à Assembly pour corriger les erreurs
  • Mettre à jour la référence de service à nouveau
0
popiandro

Comme indiqué ci-dessus, plusieurs problèmes sont possibles. Nous avons constaté 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 de résolution des objets et a donc provoqué le "vidage" des fichiers par les étapes de génération de code. Désactiver l'utilisation de "Types de réutilisation ..." peut sembler être une réponse, mais cela crée des définitions supplémentaires de types d'objet, qui sont des proxies vers les types réels, dans un nouvel espace de noms, ce qui pose alors toutes sortes de problèmes de "compatibilité" avec l'utilisation de ces types. Cochez cette option uniquement si vous voulez vraiment "masquer" un type.

Masquer le type serait approprié si vous ne voulez pas qu'une dépendance de type "DLL" se "fuie" dans un projet que vous essayez de garder séparé d'un autre. Si le DLL du projet de bibliothèque WCF s'insinue dans les références du projet client, vous aurez ce problème avec toutes sortes d'effets secondaires étranges, car les définitions de type figurent également dans la DLL.

0
Grwon

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

0
Prashant

Je reçois 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, veillez à les rajouter.

0
CartoJunkie

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

0
CodingYoshi

"Types de réutilisation" 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 sur "Ajouter une référence Web". Maintenant, liez-vous à votre WSDL et tout devrait fonctionner.

0
FrankyHollywood

J'ai rencontré ce problème lorsque 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 du service a été modifiée et la génération a échoué.

0
Alexei

Je rencontrais ce problème lorsque j'essayais de mettre à jour ma référence de service (le message d'erreur n'apparaissait que lors de l'ajout d'une référence de service) mais je ne voulais pas supprimer la case à cocher Réutiliser l'assembly.

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

  • Supprimer l'assemblage référencé que je voulais réutiliser
  • Mettre à jour la référence de service
    • Conserver "les types de réutilisation dans les assemblys référencés spécifiés"
    • Ignorer les erreurs, c'est parce que la référence est manquante!
  • Ajoutez à nouveau une référence à Assembly pour corriger les erreurs
  • Mettre à jour la référence de service à nouveau

Voila, maintenant il met à jour et n'essaye plus de supprimer tout le code généré.

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

0
Shahin Dohan