2010-11-25 2 views
12

私は複数のIPアドレスを持つサーバーを持っています。今私はhttpプロトコルでいくつかのサーバーと通信する必要があります。各サーバーは、自分のサーバーの指定されたIPアドレスからの要求のみを受け入れます。しかし、.NETでWebRequest(またはHttpWebRequest)を使用する場合、リクエストオブジェクトは自動的にIPアドレスを選択します。私はとにかくアドレスでリクエストをバインドすることはできません。指定したIPアドレスから.NET FrameworkでWebリクエストを送信できますか?

どうすればよいですか?あるいは、自分自身でWebリクエストクラスを実装する必要がありますか?あなたがこの記事を読んでいるかどうか

答えて

12

あなたがServicePoint.BindIPEndPointDelegateコールバックを使用する必要があります。 HttpWebRequestの関連付けられたソケットは、リモートエンドへの接続を試みる前に、デリゲートが呼び出される

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

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

あなたがWebClientを使用してこれを実行したい場合は、それをサブクラス化する必要があります:

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の部分)

関連する問題