2010-11-25 10 views
12

Tengo un servidor con múltiples direcciones IP. Ahora necesito comunicarme con varios servidores con protocolo http. Cada servidor solo acepta la solicitud desde una dirección IP específica de mi servidor. Pero al usar WebRequest (o HttpWebRequest) en .NET, el objeto de solicitud elegirá una dirección IP automáticamente. No puedo encontrar de todos modos para vincular la solicitud con una dirección.¿Puedo enviar webrequest desde una dirección IP especificada con .NET Framework?

¿Hay alguna forma de hacerlo? ¿O tengo que implementar una clase de webrequest?

Respuesta

12

Es necesario utilizar la devolución de llamada ServicePoint.BindIPEndPointDelegate.

http://blogs.msdn.com/b/malarch/archive/2005/09/13/466664.aspx

El delegado se llama antes de la toma de corriente asociado con el HttpWebRequest intenta conectarse al extremo remoto.

public static IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount) 
{ 
    Console.WriteLine("BindIPEndpoint called"); 
     return new IPEndPoint(IPAddress.Any,5000); 

} 

public static void Main() 
{ 

    HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://MyServer"); 

    request.ServicePoint.BindIPEndPointDelegate = new BindIPEndPoint(BindIPEndPointCallback); 

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

} 
+1

Increíble. ¡El problema acaba de resolverse de una manera tan simple! Gracias, Sam. –

+0

No recomiendo configurar el puerto a 5000. Esto puede causar tiempos de espera si realiza solicitudes con varias instancias en este puerto. En cambio, establecería el puerto en 0 y dejaría que la capa tcp manejara las conexiones, lo que siempre será a través del puerto 80 de todos modos. – Mike

6

Si quieres hacer esto utilizando WebClient que necesita para una subclase:

var webClient = new WebClient2(IPAddress.Parse("10.0.0.2")); 

y la subclase:

public class WebClient2 : WebClient 
{ 
    public WebClient2(IPAddress ipAddress) { 
     _ipAddress = ipAddress; 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     WebRequest request = (WebRequest)base.GetWebRequest(address); 

     ((HttpWebRequest)request).ServicePoint.BindIPEndPointDelegate += (servicePoint, remoteEndPoint, retryCount) => { 

      return new IPEndPoint(_ipAddress, 0); 
     }; 

     return request; 
    } 
} 

(gracias @Samuel para todo parte importante de ServicePoint.BindIPEndPointDelegate)

Cuestiones relacionadas