come cambiare l’IP originario in HttpWebRequest

Sto eseguendo questa applicazione su un server che ha assegnato 5 IP. Io uso HttpWebRequest per recuperare alcuni dati da un sito web. Ma quando effettuo la connessione, sono in grado di specificare quale dei 5 IP da cui effettuare la connessione. HttpWebRequest supporta questo? Se non lo è, posso ereditare una class da essa per modificare il suo comportamento? Ho bisogno di idee qui.

Il mio codice adesso è qualcosa del tipo:

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

Secondo questo , no. Potrebbe essere necessario accedere a Socket, dove so che è ansible scegliere l’IP locale.

EDIT: in realtà, sembra che sia ansible. HttpWebRequest ha una proprietà ServicePoint, che a sua volta ha BindIPEndPointDelegate , che potrebbe essere quello che stai cercando.

Dammi un minuto, ho intenzione di fare un esempio …

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

Fondamentalmente, il delegato deve restituire un IPEndPoint. Puoi scegliere quello che vuoi, ma se non può associarlo, chiamerà di nuovo il delegato, fino a int.MAX_VALUE volte. Ecco perché ho incluso il codice per gestire IPv6, dal momento che IPAddress.Any è IPv4.

Se non ti interessa di IPv6, puoi sbarazzartene. Inoltre, lascio la scelta effettiva di IPAddress come esercizio per il lettore 🙂

Prova questo:

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

Quindi prova a impostare ConnectionGroupName su qualcosa di diverso per IP sorgente che desideri utilizzare.

modifica: utilizzare questo insieme al delegato di binding IP dalla risposta sopra.