138 votes

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

J'ai une solution de service Windows et j'essaie d'ajouter une référence de service à un service Web Hermes (Opensource ebms message server) dans VS2010.

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

Quelques recherches semblent suggérer que cela est dû au fait que svcutil.exe n'a pas pu construire les proxys car il n'a pas les droits sur un répertoire (probablement 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, ou s'il s'agit simplement d'un faux-fuyant.

Toute idée serait grandement appréciée.

Merci

313voto

smhnkmr Points 2085

Il faut décocher l'option Réutiliser les types dans tous les assemblages référencés de l'option Configurer la référence du service.

Consultez cette page pour plus de détails

3 votes

Sinon, lorsque la "réutilisation des types dans les assemblages référencés" est réellement nécessaire, vous pouvez ajouter la référence du service à partir d'un projet de bibliothèque de classe spécialement créé à cet effet. Vérifiez mon réponse pour plus d'informations.

0 votes

Je voulais une solution sans décocher "réutiliser les types", et j'ai réussi à en trouver une qui fonctionne, voir ma réponse ici .

0 votes

Au lieu de faire quelque chose comme ça, utilisez les assemblages dont le client WCF dépend au lieu d'utiliser aveuglément tous ceux qui sont référencés. Cela peut être délicat et plus long que de décocher la case en question, mais je trouve cette solution plus adaptée que celle marquée comme réponse.

128voto

Darren Davies Points 29038

Cliquez à droite sur votre référence de service et choisissez Configure Service Reference...

Configure Service Reference

Ensuite, désélectionnez Reuse types in referenced assemblies

Reuse Types

Cliquez sur OK nettoyer et reconstruire votre solution.

2 votes

Que faire si je dois réutiliser les assemblages référencés ? J'ai un projet et cette case est cochée. La mise à jour fonctionne sur ma machine, mais pas sur celle d'un collègue de travail... des indices ?

0 votes

Cela s'est produit lorsque j'ai effectué la mise à niveau de la v4.6.1 à la v4.7 avec mon projet. Cela a été corrigé.

19voto

Florin Dumitrescu Points 3501

J'ai également rencontré une erreur similaire lorsque j'ai essayé de générer le client d'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 à partir duquel j'essayais de générer le client faisait référence à un assemblage qui, à son tour, dépendait d'un autre assemblage qui n'était pas référencé lui aussi.

Lorsque l'option "Réutiliser les types dans les assemblages référencés" est activée dans la configuration du service, le générateur de service inspecte probablement tous les assemblages référencés pour obtenir une liste des types qui peuvent être réutilisés. Le fait que l'un des assemblages référencés fasse référence à un autre assemblage qui n'est pas disponible est probablement la cause de l'échec 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 il y a un effet secondaire à cela. L'option de réutilisation des types est là pour une raison. et dans certains cas, cela évite un casting inutile dans le code consommant le service.

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

Une alternative que je préfère pour désactiver la réutilisation des types est d'ajouter la référence du service à partir du projet de la bibliothèque de classes spécialement 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.

Si des types définis dans des assemblages locaux doivent être réutilisés dans le service client, ces assemblages doivent simplement être référencés dans le projet de bibliothèque de classes mentionné ci-dessus, avec toutes leurs dépendances.

0 votes

Bizarre. J'ai changé mon binding de HttpBinding à NetNamedPipeBinding (j'ai aussi ajouté un endpoint mex) et j'ai encouter ceci dans mon assemblage client A. J'ai créé une nouvelle librairie de classe B qui fait référence à mon service WCF. Puis j'ai ajouté B comme référence à A et comme par magie tout fonctionne à nouveau. Très étrange. Merci pour la solution

3voto

user2144589 Points 31

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 suis rendu compte que l'assemblage utilisé dans le service web est une version différente de l'assemblage utilisé sur le client.

Il fonctionne parfaitement après la mise à jour de l'assemblage sur le client.

2voto

Aliostad Points 47792

Il serait extrêmement difficile de deviner le problème puisqu'il est dû à une erreur dans le WSDL et le Sans examiner le WSDL, je ne peux pas faire beaucoup plus de commentaires. Donc si vous pouvez partager votre WSDL, merci de le faire.

Tout ce que je peux dire, c'est qu'il semble manquer un schéma dans le WSDL (avec l'espace de noms cible "http://service.ebms.edi.cecid.hku.hk/"). Je suis au courant des problèmes et du traitement différent du schéma lorsque les instructions d'inclusion sont ignorées.

En général, je trouve que l'implémentation des services web de Microsoft est plutôt bonne, donc je pense que le service web renvoie un WSDL douteux.

0 votes

Merci Aliostad, je vais essayer de partager le WSDL quand je rentrerai du travail.

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