2010-07-26 4 views
6

Scénario:Ajout WCF Service de référence ne génère pas de code

  • projet de site Web sous .NET 3.5
  • Visual Studio 2010
  • WCF Service de référence

Problème:
J'essaie d'étendre une classe marquée avec l'attribut DataContract. Je pense que la classe générée a été déclarée partial, de sorte que je pourrais facilement l'étendre. J'ai essayé de déclarer une classe partielle dans le même espace de noms avec le même nom, mais elle ne semble pas reconnaître la classe qu'elle étend. J'ai essayé de localiser le fichier de code généré (Reference.cs) que je pensais avoir existé après avoir lu ce article dans le dossier de référence, mais ce n'était pas là. En essayant de naviguer vers la définition de la classe, j'ai découvert qu'il était dans une bibliothèque compilée, et le plus gros problème est qu'il n'a pas été déclaré comme partiel.
Question:
Cette différence est-elle liée au fait que j'utilise un site Web et non un projet Web? Si oui, y a-t-il un moyen de faire en sorte que le générateur de code (qui semble aussi compiler le code généré) déclare la classe comme partielle?

Répondre

3

Oui, vous pouvez déclarer vos classes DataContract comme partielles. Pour cela, vous devez utiliser le DTO pattern. Fondamentalement, cela signifie définir des classes "partagées" dans un assemblage différent, et avoir à la fois le service et l'application qui consomme le service, les deux référencer l'ensemble avec vos classes communes. Par exemple, votre assembly "DTO" peut contenir un DTO appelé "Product". Ok, donc vous les rendez Partial, et ensuite vous décorez Product, et quel autre Class avec les attributs WCF, comme DataContract et DataMember etc.

Maintenant, vous référencez votre assembly DTO avec votre projet Service, et votre Web Projet.Maintenant, lorsque vous allez dans votre projet Web et cliquez sur "Ajouter une référence de service", cliquez sur "Avancé", et vous remarquerez que vous pouvez activer une option pour "résilier les assemblages référencés". faites cela et vous aurez un contrôle total sur vos DataContracts.

+0

Merci, en essayant ceci maintenant. – scripni

+0

cool, comment ça s'est passé? – andy

+0

Cela fonctionne mais pas dans mon cas, l'une des raisons pour lesquelles j'avais besoin de toute la logique métier séparée de la couche de présentation était que la logique métier s'exécutait sous .NET 4.0, tandis que le site Web fonctionnait sous .NET 3.5. Donc, je ne peux pas avoir une référence qui fonctionne à la fois pour la couche de service et pour la couche de présentation (je pense). Merci pour la solution cependant, il sera utile de connaître sur d'autres projets. – scripni

0

Les classes de proxy de référence client vides peuvent en effet être un problème très frustrant à résoudre.

Je recommande que vous utilisez la WCF Test Client ou ligne de commande svcutil.exe. contre le service - vous pouvez souvent obtenir une description d'erreur beaucoup plus détaillée avec ces outils que grâce à l'assistant de référence de service Visual Studio.

Dans mon cas, les problèmes sont toujours liés à sérialisation ou les questions de l'entité espace de nommage/graphique - généralement dépareillées get et set sur DataMember propriétés, manquantes KnownType sur les entités polymorphes ou références circulaires dans le graphique.

Partiel ne devrait pas être un problème. Assurez-vous simplement que toutes les propriétés supplémentaires que vous souhaitez sérialiser sont marquées comme DataMember. Si tout le reste échoue, nous vous recommandons d'exécuter un test d'unité de sérialisation/désérialisation sur votre graphe entité/entité.

Questions connexes