165 votes

Parfois l’ajout d’une référence de Service WCF génère un vide reference.cs

Parfois l’ajout d’une référence de Service WCF génère un reference.cs vide et je ne peux pas référencer le service n’importe où dans le projet.

Si quelqu'un a rencontré ce ?

391voto

Anderson Imes Points 18093

En général, je trouve que c'est un codegen question et la plupart du temps c'est parce que j'ai un nom de type de conflit, il ne pouvait pas résoudre.

Si vous cliquez droit sur votre service de référence et cliquez sur configurer et décochez la case "Réutiliser les Types dans les Assemblys Référencés" il va susceptibles de résoudre le problème.

Si vous étiez à l'aide de certains aspects de cette fonctionnalité, vous pourriez avoir besoin pour vous assurer que vos noms sont nettoyées.

39voto

dblood Points 928

Comme la accepté de répondre à points, un type de problème de référence en cas de réutilisation de types est probablement le coupable. J'ai trouvé quand vous ne pouvez pas déterminer facilement la question est alors de l'aide svcutil.exe ligne de commande va vous aider à révéler le problème sous-jacent (comme John Saunders points).

En tant qu'accessoire, voici un exemple rapide de l'utilisation de svcutil.

svcutil /t:code https://secure.myserver.com/services/MyService.svc /d:test /r:"C:\MyCode\MyAssembly\bin\debug\MyAssembly.dll"

Où:

  • /t:code permet de générer le code à partir de l'url donnée
  • /d: pour spécifier le répertoire de sortie
  • /r: pour spécifier un ensemble de référence

Plein svcutil référence en ligne de commande ici: http://msdn.microsoft.com/en-us/library/aa347733.aspx

Une fois que vous exécutez svcutil, vous devriez voir l'exception levée par l'importation. Vous pouvez recevoir ce type de message sur l'un de vos types: "référencé type de ne peut pas être utilisé car il ne correspond pas importé DataContract".

Cela pourrait tout simplement être comme spécifié dans qu'il existe une différence dans l'un des types dans l'assembly référencé à partir de ce qui a été généré dans le DataContract pour le service. Dans mon cas, le service, j'ai été importation avait plus récente, mise à jour des types de ce que j'avais dans le partage de l'assemblée. Ce n'était pas évident parce que la catégorie mentionnée à l'exception semble être le même. Ce qui était différent était l'un des complexes imbriquées les types utilisés par le type.

Il y a d'autres scénarios plus complexes qui peuvent déclencher ce type d'exception et résultant vide de référence.cs. Ici est un exemple.

Si vous rencontrez ce problème et vous n'êtes pas à l'aide de types génériques dans vos données, de contrats, ni êtes-vous à l'aide de ' IsReference = vrai, alors je vous recommandons de vérifier que votre partagée types sont exactement les mêmes sur votre client et le serveur. Sinon, vous risquez de rencontrer ce genre de problème.

12voto

Matt Kane Points 71

J'ai été le dénigrement de ma tête pour une journée entière avec ce problème exact. J'ai juste corrigé. Voici comment...

Le service a eu à exécuter sur SSL (c'est à dire qu'il est à https://mydomain.com/MyService.svc)

Ajouter une référence de service pour le service WCF sur un serveur de développement, a très bien fonctionné.

Le déploiement de l' exacte même construire de la WCF service sur le serveur de production en direct, puis en passant à l'application client et la configuration du service de référence à point pour le service live affiche aucune erreur, mais l'application ne serait pas de construire: Il s'avère que le service de référence de Référence de.cs fichier était complètement vide! La mise à jour de la référence de service ne fait pas de différence. La solution de nettoyage n'a pas aidé. Le redémarrage de VS2010 fait pas de différence. La création d'une nouvelle solution, à partir d'une console de projet et d'ajouter une référence de service pour le service live exposé exactement le même problème.

Je ne pense pas que c'était à cause du conflit entre les types ou quoi que ce soit, mais ce que le diable - j'ai reconfiguré le service WCF référence en décochant "Réutiliser les types dans tous les assemblys référencés". Pas de joie; j'ai mis la case à cocher.

La prochaine étape est d'essayer svcutil sur l'URL de référence pour voir si cela permet de découvrir le problème. Voici la commande:

svcutil /t:code https://mydomain.com/MyService.svc /d:D:\test

Ce produit suivantes:

Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1]
Copyright (c) Microsoft Corporation.  All rights reserved.

Attempting to download metadata from 'https://mydomain.com/MyService.svc' using WS-Metadata Exchange or DISCO.
Error: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Schema with target namespace 'http://mynamespace.com//' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://mynamespace.com//']/wsdl:portType[@name='IMyService']


Error: 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://mynamespace.com//']/wsdl:portType[@name='IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']


Error: 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://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:service[@name='MyService']/wsdl:port[@name='WSHttpBinding_IMyService']


Generating files...
Warning: No code was generated.
If you were trying to generate a client, this could be because the metadata documents did not contain any valid contracts or services
or because all contracts/services were discovered to exist in /reference assemblies. Verify that you passed all the metadata documents to the tool.

Warning: If you would like to generate data contracts from schemas make sure to use the /dataContractOnly option.

Qui m'avait complètement perplexe. Malgré de lourdes googler et vraiment plutôt de la croix, et de reconsidérer une carrière en tant que chauffeur de bus, j'ai finalement demandé pourquoi il OK travaillé sur le développement de la zone. Pourrait-il être un problème de configuration de IIS?

Je distants simultanément dans le développement et vivre des boîtes, et à chaque j'ai allumé le Gestionnaire des services internet (IIS 7.5). Ensuite, je suis passé par chaque paramètre de configuration sur chaque boîte, en comparant les valeurs sur chaque serveur.

Et là est le problème: Dans "Paramètres SSL" pour le site, assurez-vous que "Exiger SSL" est cochée, et de vérifier le certificat du Client radio bouton "Accepter". Problème résolu!

12voto

John Saunders Points 118808

Lorsque cela se produit, regardez dans la fenêtre des Erreurs et la Sortie de la fenêtre pour voir si il y a des messages d'erreur. Si cela ne fonctionne pas, essayez d'exécuter svcutil.exe manuellement, et de voir si il y a des messages d'erreur.

6voto

user1353936 Points 31

J'ai trouvé que c'surviennent fréquemment à chaque fois que j'ajoute une référence, retirez-la, puis ajoutez à nouveau un service avec le même nom. Le type de conflits semblent être causées par les anciens fichiers restants quelque part que Visual Studio peut encore voir. Tout ce que je dois faire pour le réparer, est propre avant d'ajouter la nouvelle référence.

  1. Supprimer le service de référence d'avoir des problèmes.
  2. Cliquez sur le nom du projet dans l' Explorateur de solutions pour mettre en surbrillance le projet.
  3. Cliquez-droit sur le projet de référence.
  4. Près du haut de la liste contexte, cliquez sur le Propre de l'élément.
  5. Ajoutez votre service de référence comme vous le feriez normalement.

Espérons que cette aide.

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