2010-07-27 10 views
16

Estoy ejecutando esta aplicación en un servidor que ha asignado 5 direcciones IP. Yo uso HttpWebRequest para obtener algunos datos de un sitio web. Pero cuando hago la conexión, puedo especificar de cuál de las 5 direcciones IP se debe establecer la conexión. ¿HttpWebRequest es compatible con esto? Si no, ¿puedo heredar una clase de él para cambiar su comportamiento? Necesito esas ideas aquí.cómo cambiar la IP de origen en HttpWebRequest

Mi código en este momento es algo así como:

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

Reformatee un poco para que el código sea más fácil de leer. – riwalk

+0

lo siento. Lo pegué y así es como el foro lo publicó. No tengo idea por qué. Debería ser mejor ahora. –

+0

Gracias. Entiendo cómo va :) – riwalk

Respuesta

26

Según this, no. Puede que tenga que hacer clic para usar Sockets, donde sé que puede elegir la IP local.

EDITAR: en realidad, parece que es posible. HttpWebRequest tiene una propiedad de ServicePoint, que a su vez tiene BindIPEndPointDelegate, que puede ser lo que está buscando.

Dame un minuto, voy a azotar encima de un ejemplo ...

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); 

Básicamente, el delegado tiene que devolver un IPEndPoint. Puedes elegir lo que quieras, pero si no se puede vincular, volverá a llamar al delegado, hasta int.MAX_VALUE veces. Es por eso que incluí el código para manejar IPv6, ya que IPAddress.Any es IPv4.

Si no te importa IPv6, puedes deshacerte de eso. Además, les dejo la elección real de la Dirección IP como un ejercicio para el lector :)

+1

ese tipo quería parodiar la ip. Quería usar una IP que no le pertenece. En mi caso, estas IP se enumeran en mi interfaz de red. –

+0

La idea es la misma. Sin embargo, parece que lo que necesita es posible ... He editado mi respuesta para reflejar esto, y estoy en el proceso de crear un ejemplo/probarlo ... –

+0

Bien, he agregado un ejemplo. : D –

1

Prueba esto:

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(); 
} 

intente ajustar las ConnectionGroupName a algo distinto por IP de origen que desea utilizar.

editar: utilice esto junto con el delegado de enlace de IP de la respuesta anterior.

Cuestiones relacionadas