2010-10-02 5 views
1

J'ai 2 contrats (cA & cB) mis en œuvre par un seul service WCF avec 2 points de terminaison (epA & epB). Pour des raisons de sécurité, mais uniquement pour des raisons de clarté/d'organisation, je souhaite "voir" les opérations de ContractA lorsque je découvre le service via endpointA; et de même, ne voyez que les opérations de ContractB via endpointB.Forme un service WCF par point de terminaison

Je n'ai pas besoin de "protéger" ces opérations en soi. Le scénario est tel qu'un client donné n'a besoin que d'un «côté» du service, jamais les deux (mais, les opérations partagent elles-mêmes des ressources, il est donc logique d'avoir un seul service plutôt que deux services).

Il semble que tout service donné obtient fondamentalement 1 WSDL, toutes les opérations sont exposées à tous les points d'extrémité. Est-ce la façon dont cela fonctionne, ou existe-t-il un moyen de «former» un point de terminaison en occultant des opérations qui ne sont pas définies par le contrat des points de terminaison?

Répondre

1

Par défaut, vous avez raison - une classe d'implémentation de service obtient un WSDL qui contient toutes les méthodes de service (de tous les contrats de service) que cette classe de service implémente. Il n'y a aucun moyen (pour autant que je sache) de "façonner" le WSDL de n'importe quelle manière (facile) - WCF offre des moyens pour entrer dans le processus de création du WSDL (statiquement ou dynamiquement), mais ceux ne sont pas pour les faibles de cœur. Il serait beaucoup plus facile pour vous de simplement diviser l'implémentation des contrats de service en deux classes distinctes, puis vous auriez deux services distincts, des WSDL distincts et tous.

1

Marc a absolument raison. J'ajoute juste pourquoi cela se passe dans la WCF. Dans WCF, toutes les fonctionnalités liées aux métadonnées sont basées sur le comportement des métadonnées de service et sur le point de terminaison mex. Ces deux fonctionnalités sont définies au niveau du service. Vous ne pouvez donc pas prendre plus de granularité (à moins d'écrire beaucoup de code personnalisé) et spécifier des métadonnées par point de terminaison.

Le service WCF (classe) est mappé directement à l'élément de service wsdl: qui expose chaque contrat en tant que port wsdl: distinct (en tant que point de terminaison dans WCF). C'est le point principal dans la réponse à votre question. Si vous ne voulez pas votre deuxième contrat dans ce service wsdl: vous ne pouvez pas l'implémenter dans la même classe.

Vous avez mentionné que vos contrats de service partagent des ressources. Dans ce cas, votre service WCF contient probablement également une logique métier. C'est une raison pour vos problèmes. La bonne conception de l'implémentation des services WCF consiste à les créer uniquement en tant que wrappers autour de classes de logique métier distinctes.

+0

Vous avez raison, mes opérations WCF exécutent directement la logique métier. Je n'avais pas envisagé d'implémenter les opérations de service comme des wrappers pour les classes business mais je me rends compte maintenant que ce serait beaucoup mieux à bien des égards, donc merci pour ce conseil. – with

Questions connexes