2010-07-27 22 views
16

Je cours cette application sur un serveur qui a assigné 5 adresses IP. J'utilise HttpWebRequest pour aller chercher des données sur un site web. Mais quand je fais la connexion, je suis capable de spécifier laquelle des 5 adresses IP pour établir la connexion. Est-ce que HttpWebRequest supporte cela? Si ce n'est pas le cas, puis-je en hériter une classe pour changer son comportement? J'ai besoin d'idées ici.comment changer l'origine IP dans HttpWebRequest

Mon code est quelque chose comme en ce moment:

System.Net.WebRequest request = System.Net.WebRequest.Create(link); 
((HttpWebRequest)request).Referer = "http://application.com"; 
using (System.Net.WebResponse response = request.GetResponse()) 
{ 
    StreamReader sr = new StreamReader(response.GetResponseStream()); 
    return sr.ReadToEnd(); 
} 
+0

Veuillez reformater un peu afin que le code soit plus facile à lire. – riwalk

+0

désolé. Je l'ai collé et c'est comme ça que le forum l'a posté. Aucune idée pourquoi. Ça devrait être mieux maintenant. –

+0

Merci. Je comprends comment ça se passe :) – riwalk

Répondre

26

Selon this, non. Vous devrez peut-être passer à l'utilisation de Sockets, où je sais que vous pouvez choisir l'adresse IP locale.

EDIT: en fait, il semble que ce soit possible. HttpWebRequest a une propriété ServicePoint, qui à son tour a BindIPEndPointDelegate, ce qui peut être ce que vous cherchez.

Donne-moi une minute, je vais concocter un exemple ...

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://stackoverflow.com"); 

req.ServicePoint.BindIPEndPointDelegate = delegate(
    ServicePoint servicePoint, 
    IPEndPoint remoteEndPoint, 
    int retryCount) { 

    if (remoteEndPoint.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) { 
     return new IPEndPoint(IPAddress.IPv6Any, 0); 
    } else { 
     return new IPEndPoint(IPAddress.Any, 0); 
    } 

}; 

Console.WriteLine(req.GetResponse().ResponseUri); 

Fondamentalement, le délégué doit retourner un IPEndPoint. Vous pouvez choisir ce que vous voulez, mais s'il ne peut pas lier, il appellera le délégué à nouveau, jusqu'à int.MAX_VALUE fois. C'est pourquoi j'ai inclus le code pour gérer IPv6, puisque IPAddress.Any est IPv4.

Si vous ne vous souciez pas d'IPv6, vous pouvez vous en débarrasser. De plus, je laisse le choix réel de la IPAddress comme un exercice au lecteur :)

+1

ce type voulait usurper l'ip. Il voulait utiliser une adresse IP qu'il ne possède pas. Dans mon cas, ces adresses IP sont listées sur mon interface réseau. –

+0

L'idée est la même. Cependant, il semble que ce dont vous avez besoin EST possible ... J'ai édité ma réponse pour refléter ceci, et je suis en train de créer un exemple/de le tester ... –

+0

Bon, j'ai ajouté un exemple. : D –

1

Essayez ceci:

System.Net.WebRequest request = System.Net.WebRequest.Create(link); 
request.ConnectionGroupName = "MyNameForThisGroup"; 
((HttpWebRequest)request).Referer = "http://application.com"; 
using (System.Net.WebResponse response = request.GetResponse()) 
{ 
    StreamReader sr = new StreamReader(response.GetResponseStream()); 
    return sr.ReadToEnd(); 
} 

, puis mettre le ConnectionGroupName à quelque chose de distinct par IP source que vous souhaitez utiliser. Edit: utilisez ceci en conjonction avec le délégué de liaison IP de la réponse ci-dessus.