I have a server with multi ip addresses. Now I need to communicate with several servers with http protocol. Each server only accept the request from a specified ip address of my server. But when using WebRequest(or HttpWebRequest) in .NET , the request object will choose a ip address automatically. I can't find anyway to bind the request with a address.
Is there anyway to do so ? Or I have to implement a webrequest class myself ?
If you want to do this using WebClient
you'll need to subclass it:
var webClient = new WebClient2(IPAddress.Parse("10.0.0.2"));
and the subclass:
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;
}
}
(thanks @Samuel for the all important ServicePoint.BindIPEndPointDelegate part)
You need to use the ServicePoint.BindIPEndPointDelegate
callback.
http://blogs.msdn.com/b/malarch/archive/2005/09/13/466664.aspx
The delegate is called before the socket associated with the httpwebrequest attempts to connect to the remote end.
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();
}
Not sure whether you read this post (?)
How to specify server IP in HttpWebRequest
or
Specifying Source IP of HttpWebRequest
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With