2010-03-02 4 views
7

Semblable à la limitation du serveur Web de développement Visual Studio (Cassini) que seuls serveurs sur localhost, j'ai une implémentation du service WCF qui est seulement nécessaire sur localhost.Configurer WCF pour LOCALHOST-écoute seulement

Je ne voudrais pas d'autres machines ayant accès, sauf que le pare-feu Windows demande au programme d'écouter sur la carte réseau externe. Comme cela n'est nécessaire qu'en interne, je préférerais restreindre la configuration côté serveur WCF afin qu'il ne déclenche pas le détecteur de pare-feu. La bonne solution? binding.HostNameComparisonMode = HostNameComparisonMode.Exact Je ne vois pas comment cela suffit.

====

Comme Cassini, cette implémentation de service est un remplaçant pour autre chose qui ne nécessite la communication réseau. Le client peut être configuré pour se connecter au serveur réel ou à la fausse implémentation s'exécutant sur localhost.

Répondre

0

Cela dépend de la façon dont vous l'hébergez. Si vous êtes dans IIS7 ou WAS, WCF utilise le mode de correspondance d'IIS. Sinon, si vous utilisez HostNameComparisonMode.Exact, alors oui, le nom de l'hôte sera toujours un facteur critique dans la correspondance. Si le nom d'hôte ne correspond pas, l'envoi échouera généralement.

Il convient de noter que exact n'est pas 100% parfaitement exact ... il permet toujours une certaine variation dans le nom d'hôte. Si vous disposez à la fois d'un nom d'hôte NetBIOS et d'un nom DNS complet, la correspondance se produit toujours, car WCF traite ces deux comme un seul et même.

System.ServiceModel.BasicHttpBinding.HostNameComparisonmode

+0

J'ai essayé la liaison.HostNameComparisonMode = HostNameComparisonMode.Exact à nouveau et cela ne fonctionne pas. Après avoir supprimé les règles de pare-feu Windows correspondantes, le pare-feu vous invite à nouveau à l'autoriser. –

+0

J'ai également ajouté un nouvel Uri ("net.tcp: // localhost") 'comme adresse de base au constructeur ServiceHost –

+0

Eh bien, il semble que le pare-feu vous demandera s'il s'agit d'un hôte loopback ou ne pas. Je ne suis pas sûr s'il y a quelque chose que vous pouvez faire à ce sujet, autre que d'utiliser des tubes nommés. – jrista

6

Je pense que vous approchez de la mauvaise façon. Vous devez utiliser la liaison de canal nommé, qui doit prendre en charge le modèle d'échange de messages que vous utilisez (elle prend en charge la demande de réponse, ainsi que les mêmes modes de concurrence et d'état de session que WS prend en charge).

Dans la section de MSDN intitulé "Choosing a Transport" (Souligné par l'auteur):

Quand utiliser le canal nommé Transport

Un tube nommé est un objet dans le noyau du système d'exploitation Windows , tel comme une section de mémoire partagée que processus peuvent utiliser pour la communication. Un tube nommé a un nom et peut être utilisé pour la communication unidirectionnelle ou duplex entre les processus sur une seule machine.

Lorsque la communication est nécessaire entre les différentes applications WCF sur un seul ordinateur, et que vous voulez empêcher toute communication d'une autre machine , puis utilisez les canaux nommés de transport . Une restriction supplémentaire est que les processus exécutant à partir de Windows Bureau à distance peuvent être limités à la même session Windows Remote Desktop à moins qu'ils aient des privilèges élevés.

Cela répond exactement à vos besoins et ne devrait pas être plus qu'un changement de configuration.

+0

D'accord; "localhost only" est vraiment "communication interprocessus", et les tubes nommés sont les meilleurs pour cela. – Randolpho

+0

Désolé - Je vais clarifier: Comme Cassini, cette implémentation de service est un substitut à quelque chose d'autre qui nécessite une communication réseau. Le client peut être configuré pour se connecter au serveur réel ou à la fausse implémentation s'exécutant sur localhost. –

+0

@Jason: Si le client peut être configuré, pourquoi ne pas le configurer pour utiliser un point de terminaison de canal nommé plutôt qu'un point de terminaison HTTP? Comme WCF est capable des deux, et l'appel d'un service via le canal par rapport à http est le même pour WCF ... pourquoi s'embêter avec quoi que ce soit d'autre? – jrista

Questions connexes