2010-11-25 11 views
12

मेरे पास बहु आईपी पते वाले सर्वर हैं। अब मुझे http प्रोटोकॉल के साथ कई सर्वरों के साथ संवाद करने की आवश्यकता है। प्रत्येक सर्वर केवल मेरे सर्वर के निर्दिष्ट आईपी पते से अनुरोध स्वीकार करता है। लेकिन .NET में WebRequest (या HttpWebRequest) का उपयोग करते समय, अनुरोध ऑब्जेक्ट स्वचालित रूप से एक आईपी पता चुन देगा। मैं किसी पते के साथ अनुरोध को बाध्य करने के लिए वैसे भी नहीं ढूंढ सकता।क्या मैं निर्दिष्ट आईपी पते से .NET Framework के साथ webrequest भेज सकता हूं?

क्या ऐसा करने के लिए वैसे भी है? या मुझे खुद को एक वेबरेक्वेस्ट क्लास लागू करना है?

उत्तर

12

आप ServicePoint.BindIPEndPointDelegate कॉलबैक का उपयोग करने की जरूरत है।

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

से पहले httpwebrequest के साथ जुड़े सॉकेट रिमोट अंत करने के लिए कनेक्ट करने के लिए प्रयास करता प्रतिनिधि कहा जाता है।

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 पर सेट कर दूंगा और टीसीपी परत कनेक्शन को संभाल दूंगा, जो हमेशा पोर्ट 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 भाग)

संबंधित मुद्दे