2010-08-26 39 views
4

Je souhaite que ma requête émette une adresse IP spécifique. Y a-t-il un moyen de le faire dans la WCF? L'explication de pourquoi j'ai besoin de cela est un peu longue, donc je préfère ne pas entrer dans cela.Comment lier un client HTTP WCF à une adresse IP sortante spécifique avant de faire la demande

Voici un exemple de code

string ipAddress = "192.168.0.32"; 
IService service; 
ChannelFactory<IOmlService> factory = new ChannelFactory<IService>(new BasicHttpBinding(), new EndpointAddress("http://" + IPAddress + ":6996/IService")); 
service = factory.CreateChannel(); 
service.Test(); 

Voici un exemple de scénario pour expliquer exactement ce que je cherche. Disons que j'ai deux adresses IP sur ma machine (192.168.0.30 et 192.168.0.31). Les deux peuvent atteindre 192.168.0.32. Si je lance ce code maintenant, il va frapper l'adresse IP (.32) de l'une de mes adresses IP (.30 ou .31). Comment puis-je le forcer à passer par une adresse IP spécifique (disons .30). Est-il possible de faire cela en utilisant WCF?

Répondre

2

La réponse à la question est qu'il ne peut pas être fait. Voici la réponse d'un Microsoft MVP


Vous voulez laisser la machine côté client de manière proactive sélectionner l'une de l'interface réseau adpater (installé) pour envoyer les demandes WCF? Je crains que ce soit hors du contrôle de WCF puisque WCF se concentre uniquement sur les adresses suivantes:

** lorsque vous vous comportez comme hôte, nous pouvons choisir de lier un nom d'hôte spécifique pour écouter les demandes des clients ** Lorsque vous vous comportez en tant que client, nous pouvons choisir l'adresse de destination/nom d'hôte à laquelle envoyer la requête.


+0

Si cela ne peut pas être fait, et que quelqu'un ouvre une demande de fonctionnalité, je voterai pour cette fonctionnalité. –

+0

Après toutes ces années, il est toujours absent? –

0

Il me semble que votre problème devrait être résolu en définissant un protocole supplémentaire dans la table de routage. Essayez de faire à la suite de l'invite de commandes a commencé avec les droits d'administration:

route add 192.168.0.32 mask 255.255.255.255 192.168.175.30 

Si vous souhaitez enregistrer le route add -p passer outre.

+0

Je suis plus à essayer de trouver comment lier un client WCF à une adresse IP sortante spécifique dans WCF. Comment pourrais-je le lier explicitement. De plus, je ne suis peut-être pas en train de courir avec des privilèges administratifs. En outre, il s'agit d'une application qui va être utilisée sur de nombreuses machines, je ne suis pas sûr qu'il est logique de jouer par programmation avec la table de routage chaque fois que je veux faire ces demandes. – Mark

+0

En général, définissez la liaison à une adresse spécifique ** uniquement pour l'application serveur **. Ensuite, l'adresse IP du serveur sera connue. Le client établit simplement une connexion à cette adresse IP à l'aide de la table de routage. La table de routage définit par quelle interface une adresse IP peut être archivée. Au moins, la métrique d'interface le dit. Donc, si vous avez des adresses IP si exotiques sur votre segment IP, l'administrateur peut définir une fois ('route -p ...') comment l'IP de destination devrait être arrivée. Ces informations seront persistantes et ne seront pas modifiées après le redémarrage ou la connexion d'un autre utilisateur. – Oleg

+0

Il est vrai qu'en général on définit la liaison uniquement pour le serveur. Mais pour Sockets par exemple, vous pouvez définir la liaison pour le client. Ma question est qu'il est possible de le faire à partir de la WCF. C'est une question de la WCF. – Mark

1

Etes-vous en train d'essayer de créer quelque chose de similaire à IP-Sec sur le serveur afin qu'il n'accepte que les requêtes provenant d'adresses IP spécifiques?

Dans ce cas, vous devez mettre en œuvre IEndpointBehavior et IDispatchMessageInspector et:

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 
     RemoteEndpointMessageProperty remoteAddress = 
      (OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as 
      RemoteEndpointMessageProperty); 

     // validate ip here 
     return null; 
    }