2010-11-25 4 views
12

멀티 IP 주소가있는 서버가 있습니다. 이제 http 프로토콜을 사용하여 여러 서버와 통신해야합니다. 각 서버는 내 서버의 지정된 IP 주소에서 요청을 수락합니다. 그러나 .NET에서 WebRequest (또는 HttpWebRequest)를 사용할 때 요청 객체는 자동으로 IP 주소를 선택합니다. 요청을 주소로 묶는 것을 찾을 수 없습니다..NET Framework에서 지정된 IP 주소로 웹 요청을 보낼 수 있습니까?

어쨌든 그렇게 할만 큼 있습니까? 아니면 webrequest 클래스를 직접 구현해야합니까? 이 게시물을 읽을 여부를

답변

12

당신은 ServicePoint.BindIPEndPointDelegate 콜백을 사용해야합니다. 의 HttpWebRequest와 관련된 소켓이 원격 엔드에 연결을 시도하기 전에 대리자가 호출

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

. 당신이 WebClient를 사용하여이 작업을 수행하려면

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

놀라운. 이 문제는 아주 간단한 방법으로 해결되었습니다! 고마워, 샘. –

+0

포트를 5000으로 설정하는 것을 권장하지 않습니다.이 포트에서 여러 인스턴스로 요청할 경우 시간 초과가 발생할 수 있습니다. 대신 포트를 0으로 설정하고 TCP 레이어가 항상 포트 80을 통해 연결을 처리하도록합니다. – Mike

6

당신은 그것을 서브 클래스해야합니다 :

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

과 서브 클래스 : 모두를위한

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

(감사 @Samuel를 중요한 ServicePoint.BindIPEndPointDelegate 부분)

관련 문제