2009-05-03 27 views
28

मैं http का उपयोग कर स्ट्रिंग डाउनलोड करने के लिए अपने स्रोत कोड में एक वेब क्लाइंट क्लास का उपयोग कर रहा हूं।सी # वेब क्लाइंट और प्रॉक्सी सर्वर

यह ठीक काम कर रहा था। हालांकि, कंपनी के ग्राहक अब प्रॉक्सी सर्वर से जुड़े हुए हैं। और समस्या इससे शुरू हुई।

जब मैंने अपने आवेदन का परीक्षण किया है तो मुझे नहीं लगता कि यह प्रॉक्सी सर्वर से गुज़र सकता है, क्योंकि अपवाद जो फेंक रहा है वह है "xxx.xxx.xxx.xxx से कोई प्रतिक्रिया नहीं है जो प्रॉक्सी सर्वर आईपी पता है।

हालांकि, मैं अभी भी वेब साइट URL पर पहुंच सकते हैं और यह जब किसी प्रॉक्सी सर्वर से जोड़ने ब्राउज़र में सही ढंग से प्रदर्शित करता है स्ट्रिंग है, लेकिन जब मैं अपने वेब ग्राहक का उपयोग करें।

वहाँ वेब में कुछ है क्लाइंट जिसे मुझे प्रॉक्सी सर्वर के पीछे से यूआरएल तक पहुंचने की अनुमति देने के लिए कॉन्फ़िगर करना है?

using (WebClient wc = new WebClient()) 
{ 
    string strURL = "http://xxxxxxxxxxxxxxxxxxxxxxxx"; 

    //Download only when the webclient is not busy. 
    if (!wc.IsBusy) 
    { 
     string rtn_msg = string.Empty; 
     try 
     { 
      rtn_msg = wc.DownloadString(new Uri(strURL)); 
      return rtn_msg; 
     } 
     catch (WebException ex) 
     { 
      Console.Write(ex.Message); 
      return false; 
     } 
     catch (Exception ex) 
     { 
      Console.Write(ex.Message); 
      return false; 
     } 
    } 
    else 
    { 
     System.Windows.Forms.MessageBox.Show("Busy please try again"); 
     return false; 
    } 
} 

उत्तर

33

मेरे समाधान:

WebClient client = new WebClient(); 
WebProxy wp = new WebProxy(" proxy server url here"); 
client.Proxy = wp; 
string str = client.DownloadString("http://www.google.com"); 
+3

आदर्श रूप में, WebClient भी एक बयान का उपयोग करने में होना चाहिए के रूप में यह IDisposable लागू करता है। हालांकि उपयोगी पोस्ट। – Orphid

+1

ऑर्फीड से अधिक स्पष्ट होने के लिए; उपर्युक्त कोड (जो पूरी तरह से वैध है) के साथ वेब क्लाइंट पर 'डिसस्पेस' कॉल करना न भूलें! साथ ही, वेबप्रॉक्सी में एक कन्स्ट्रक्टर ओवरलोड है जो एक दूसरे नंबर के रूप में पोर्ट नंबर लेता है – user3791372

7

मैं एक ही मुद्दे का सामना करना पड़ा, लेकिन एक साथ इंटरनेट से एक फ़ाइल डाउनलोड करने के लिए एक webclient का उपयोग कर लिया है विनफॉर्म एप्लिकेशन एप.कॉन्फिग में समाधान जोड़ रहा था:

<system.net> 
    <defaultProxy useDefaultCredentials="true" /> 
</system.net> 

वही समाधान web.config में एक ही पंक्ति डालने वाले एएसपीनेट ऐप के लिए काम करेगा।

आशा है कि इससे मदद मिलेगी।

6

जोनाथन द्वारा प्रस्तावित उत्तर उचित है, लेकिन यह आवश्यक है कि आप कोड में प्रॉक्सी प्रमाण-पत्र और यूआरएल निर्दिष्ट करें। आमतौर पर, डिफ़ॉल्ट रूप से सिस्टम में सेटअप के रूप में क्रेडेंशियल्स के उपयोग की अनुमति देना बेहतर होता है (उपयोगकर्ता आमतौर पर प्रॉक्सी का उपयोग करते समय भी लैन सेटिंग्स कॉन्फ़िगर करते हैं) ...

नीचे दिए गए उत्तर को डेविड द्वारा पहले के उत्तर में प्रदान किया गया है , लेकिन इसके लिए app.config फ़ाइलों को संशोधित करने की आवश्यकता है। यह समाधान शायद अधिक उपयोगी है क्योंकि यह कोड में एक ही चीज़ करता है।

आदेश आवेदन डिफ़ॉल्ट प्रॉक्सी सेटिंग्स के रूप में उपयोगकर्ता के सिस्टम में प्रयोग किया जाता का उपयोग करने देने, एक निम्न कोड का उपयोग कर सकते हैं: (logged- साथ

IWebProxy wp = WebRequest.DefaultWebProxy; 
wp.Credentials = CredentialCache.DefaultCredentials; 
wc.Proxy = wp; 

यह आवेदन कोड प्रॉक्सी का उपयोग करने की अनुमति देगा क्रेडेंशियल्स और डिफ़ॉल्ट प्रॉक्सी यूआरएल सेटिंग्स में) ... कोई सिरदर्द नहीं! :)

आशा है कि इससे इस समस्या के भविष्य के दर्शकों को उनकी समस्या का समाधान करने में मदद मिलेगी!

+1

फ़िडलर (स्थानीय प्रॉक्सी क्लाइंट) चलाते समय मुझे ऐसा करने की ज़रूरत नहीं है? वेब क्लाइंट का उपयोग करते समय, सभी प्रॉक्सी को कॉन्फ़िगर किए बिना भी फिडलर के माध्यम से चैनल कॉल करता है। – Nilzor

14

यदि आपको प्रॉक्सी को प्रमाणीकृत करने की आवश्यकता है, तो आपको UseDefaultCredentials से false पर सेट करने की आवश्यकता है, और प्रॉक्सी Credentials सेट करें।

WebProxy proxy = new WebProxy(); 
proxy.Address = new Uri("mywebproxyserver.com"); 
proxy.Credentials = new NetworkCredential("usernameHere", "pa****rdHere"); //These can be replaced by user input 
proxy.UseDefaultCredentials = false; 
proxy.BypassProxyOnLocal = false; //still use the proxy for local addresses 

WebClient client = new WebClient(); 
client.Proxy = proxy; 

string doc = client.DownloadString("http://www.google.com/"); 

यदि आपको केवल एक साधारण प्रॉक्सी की आवश्यकता है, तो आप ऊपर की अधिकांश पंक्तियों को छोड़ दें।आप सभी की जरूरत है:

WebProxy proxy = new WebProxy("mywebproxyserver.com"); 
2
 

    byte[] data; 
       using (WebClient client = new WebClient()) 
       { 
        ICredentials cred; 
        cred = new NetworkCredential("[email protected]", "mybestpassword"); 
        client.Proxy = new WebProxy("192.168.0.1",8000); 
        client.Credentials = cred; 
        string myurl="http://mytestsite.com/source.jpg"; 
        data = client.DownloadData(myUrl); 
       } 

      File.WriteAllBytes(@"c:\images\target.jpg", data); 

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