2009-10-29 4 views
2

Salutations!Est-ce que la bibliothèque de validation de partage WCF côté serveur et côté client peut?

J'utilise une bibliothèque WCF sur un serveur d'applications, qui est référencé par un serveur IIS (qui est donc le client). Je voudrais mettre ma validation dans un endroit pour que je puisse juste appeler .Validate() qui retourne un tableau de chaînes d'erreurs (champ trop court, manquant, etc.). Le problème est que ces fonctions ne traversent pas la frontière WCF et je ne veux vraiment pas coder la même logique dans le service WCF et dans le client IIS/WCF. Existe-t-il un moyen d'utiliser des méthodes d'extension ou quelque chose de similaire pour que les deux parties puissent utiliser une méthode .Validat() qui appelle le même code?

Un grand merci pour vos idées! Steve

Répondre

5

Si vous contrôlez les deux côtés du fil, à savoir le côté serveur (service) et du côté client, alors vous pouvez faire ce qui suit:

  • mettre tous vos contrats de services et de données en commun Assemblée
  • référence Assemblée « des contrats » à la fois le serveur et le client
  • créer manuellement le proxy client (en dérivant de ClientBase<T> ou en le créant à partir d'un ChannelFactory<T>) - ne pas utiliser « Ajouter un service de référence » ou svcutil. EXE!
  • mettre toute logique de validation dans un ensemble partagé
  • référence
  • qui partage l'ensemble de validation des deux projets

Si vous souhaitez utiliser un ensemble de validation partagée, vous devez vous assurer que les types de données utilisées sur votre serveur et les clients sont identiques - cela ne peut être réalisé que si vous partagez également des contrats de service et de données. Malheureusement, cela nécessite une création manuelle du proxy client (ce qui n'est vraiment pas une grosse affaire!). Si vous utilisiez "Ajouter une référence de service", Visual Studio inspecterait le service en fonction de ses métadonnées et créerait un nouvel ensemble d'objets côté client, qui semblerait identique en termes de champs et tous, mais ils constituent un type distinct et distinct, et vous ne pourrez donc pas utiliser votre validation partagée sur les objets côté serveur et côté client.

1

Avez-vous un problème avec l'envoi des données au serveur pour être validé? En d'autres termes, votre interface de service propose la méthode "Valider" et prend un contrat de données plein de données, le valide et renvoie une liste où T est un contrat de données personnalisé ValidationResult contenant toutes les informations dont vous avez besoin sur les avertissements de validation/les erreurs.

Dans une architecture de service, vous ne pouvez pas faire confiance au client, qui pourrait théoriquement être une autre société, pour avoir effectué la validation de données appropriée pour vous. Vous devez toujours le faire au niveau de la couche de service et concevoir pour la communication de ces problèmes de validation à votre client. Donc, si vous faites ce travail sur le serveur de toute façon, pourquoi ne pas ouvrir cette logique aux clients afin qu'ils puissent l'utiliser directement? Certes, les clients peuvent (devraient) encore effectuer une sorte de validation d'entrée de base telle que la vérification des valeurs nulles, des chaînes vides, des valeurs hors limites, etc., mais les vérifications de la logique métier doivent être envoyées au service.

+0

Salut Drew, merci pour votre réponse. J'avais envisagé quelque chose de similaire - et j'ai apprécié la valeur de la validation côté serveur aussi. Cependant, le but était de trouver une manière plus créative de limiter la quantité de données à travers la WCF - donc d'offrir le côté client de la validation en premier, plutôt que de le soumettre simplement à l'échec.Si j'exposais les fonctions de validation, j'en aurais besoin pour chaque type d'objet et il faudrait encore passer par-dessus le fil - donc idéalement, j'espérais qu'il y avait un moyen de partager le code de validation pour que les deux puissent l'utiliser. – MrCraze

+0

Eh bien, il n'y a aucun moyen de partager le comportement, sauf si vous créez un assembly qui contient vos contrats de données avec ces méthodes d'assistance et le donner à vos clients. Ce n'est pas la façon «pure» de le faire d'un point de vue purement SOA (pas d'aide si c'est Java/PHP/Ruby de l'autre côté, vous savez?), Mais si c'est un service interne et que vous pouvez contrôler les clients utilisent pour communiquer avec votre service, alors vous pouvez garantir qu'ils utiliseront la dernière et la plus grande logique de validation. –

Questions connexes