2009-05-10 17 views
22

C# 2008 SP1सी # ऑटो का पता लगाने के प्रॉक्सी सेटिंग्स

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

तो मैं सिर्फ यह जांच रहा हूं कि प्रॉक्सी का पता मौजूद है या नहीं। यदि नहीं है, तो वेब क्लाइंट में सेट करने के लिए कोई प्रॉक्सी नहीं है।

इस ऐसा करने के लिए सही तरीका है:

किसी भी सलाह के लिए बहुत धन्यवाद,

WebProxy proxy = WebProxy.GetDefaultProxy(); 

if (proxy.Address.ToString() != string.Empty) 
{ 
    Console.WriteLine("Proxy URL: " + proxy.Address.ToString()); 
    wc.Proxy = proxy; 
} 

====== कोड संपादित ======

[DllImport("wininet.dll", CharSet = CharSet.Auto)] 
private extern static bool InternetGetConnectedState(ref InternetConnectionState_e lpdwFlags, int dwReserved); 

[Flags] 
enum InternetConnectionState_e : int 
{ 
    INTERNET_CONNECTION_MODEM = 0x1, 
    INTERNET_CONNECTION_LAN = 0x2, 
    INTERNET_CONNECTION_PROXY = 0x4, 
    INTERNET_RAS_INSTALLED = 0x10, 
    INTERNET_CONNECTION_OFFLINE = 0x20, 
    INTERNET_CONNECTION_CONFIGURED = 0x40 
}  

// Return true or false if connecting through a proxy server 
public bool connectingThroughProxy() 
{ 
    InternetConnectionState_e flags = 0; 
    InternetGetConnectedState(ref flags, 0); 
    bool hasProxy = false; 

    if ((flags & InternetConnectionState_e.INTERNET_CONNECTION_PROXY) != 0) 
    { 
     hasProxy = true; 
    } 
    else 
    { 
     hasProxy = false; 
    } 

    return hasProxy; 
} 

उत्तर

25

ऐसा लगता है कि WebRequest.DefaultWebProxyofficial replacement WebProxy.GetDefaultProxy के लिए है।

आपको इसे केवल एक छोटे से संशोधन के साथ अपने मूल कोड में छोड़ने में सक्षम होना चाहिए। कुछ की तरह:

WebProxy proxy = (WebProxy) WebRequest.DefaultWebProxy; 
if (proxy.Address.AbsoluteUri != string.Empty) 
{ 
    Console.WriteLine("Proxy URL: " + proxy.Address.AbsoluteUri); 
    wc.Proxy = proxy; 
} 
+0

यह अनुशंसित दृष्टिकोण है, और यह आपको अन्य कोड का एक समूह लिखने के खिलाफ प्रेरित करता है। – EricLaw

+12

मुझे पता चला है कि यह मुझे क्लास कास्ट अपवाद देता है क्योंकि WebRequest.DefaultWebProxy WebProxyWrapper को वापस कर रहा है। दुर्भाग्यवश, मेरे मामले में, WebProxyWrapper मुझे अंतर्निहित WebProxy ऑब्जेक्ट तक कोई पहुंच नहीं देता है, जो निराशाजनक है क्योंकि ऐसा लगता है कि जिस कोड को मैं डीबग करने का प्रयास कर रहा हूं वह लाइव वातावरण में प्रॉक्सी लागू नहीं कर रहा है लेकिन विकास वातावरण में ऐसा कर रहा है। – Dan

+5

मुझे एक ही समस्या है। मैं इसके बजाय वेब प्रॉक्सी के यूआरआई प्राप्त करने में कामयाब रहा: ** उरी uriProxy = WebRequest.DefaultWebProxy.GetProxy (नया उरी ("http: // someserver.com")); ** – Libor

1

System.Net.Configuration.ProxyElement क्लास देखें। उस जानकारी में हो सकता है जिसे आप ढूंढ रहे हैं।

आप जो काम करते हैं उसका वर्णन करते हैं, आप रजिस्ट्री में भी देख सकते हैं।

function get-proxy 
{ 
    $path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" 
    $reg = get-itemproperty $path 
    return $reg 
} 
3

पहले, GetDefaultProxy के रूप में पदावनत ताकि आप कोई गारंटी नहीं है उसके चारों ओर भी निकट भविष्य में होगा चिह्नित है:

यहाँ एक powershell स्क्रिप्ट मैं प्रॉक्सी की जाँच करने के लिए लिखा था है। दूसरा, शून्य हो सकता है, इसलिए आपके द्वारा दिए गए कोड को NullReferenceException:

5

WebClient आदि WinHTTP सेटिंग्स (आईई सेटिंग्स नहीं) का उपयोग करें, इसलिए सबसे आसान काम WinHTTP को कॉन्फ़िगर करना है! एक्सपी आदि पर आप इसका उपयोग कर सकते हैं:

proxycfg -u 

WinHTTP स्टोर में वर्तमान आईई सेटिंग्स आयात करने के लिए। उसके बाद, WebClient आदि बिना किसी समस्या के समान सेटिंग्स का उपयोग करने में सक्षम होना चाहिए। विस्टा और विंडोज 7 पर यह अब पाया गया है:

netsh winhttp import proxy ie 

आपको इसे व्यवस्थापक के रूप में चलाने की आवश्यकता है।

+0

मैंने एक पी/invoke का उपयोग करके अपना कोड संपादित किया है। यह कंप्यूटिंग प्रॉक्सी के माध्यम से कनेक्ट हो रहा है, तो यह अच्छी तरह से मुझे बताता है। हालांकि, मेरे प्रारंभिक कोड पोस्ट का संदर्भ। प्रॉक्सी के बारे में जानकारी प्राप्त करने का यह सही तरीका है। यानी पता, बंदरगाह? धन्यवाद। – ant2009

+0

खैर, मैं अभी भी यह मानता हूं कि WinHTTP को कॉन्फ़िगर करना स्वयं को पूछताछ करने से बेहतर विकल्प है। काम पर, सभी (गैर-स्थानीय) यातायात प्रॉक्सी के माध्यम से जाता है, और अगर मैंने पहले WinHTTP को कॉन्फ़िगर किया है तो मुझे 'WebClient' का उपयोग करके कोई समस्या नहीं हुई है। –

+0

इस समाधान के साथ समस्या यह है कि उपयोगकर्ता को आपके एप्लिकेशन का उपयोग करने के लिए सिस्टम की विस्तृत सेटिंग बदलने की आवश्यकता होती है। प्रतिबंधित वातावरण के तहत उन्हें कमांड तक पहुंच नहीं हो सकती है और/या आपके एप्लिकेशन के पास इसका उपयोग नहीं हो सकता है। – tjmoore

3

निम्नलिखित का प्रयास करें:

public string GetMeMyInfo(string searchCriteria) 
{ 
    // Instatiate the web service and declare the necessary variables 
    WsService.WsServiceBus oWsGetInfo = new WsService.WsServiceBus(); 
    // Configure the Web Service Proxy 
    oWsGetInfo.Proxy = System.Net.WebProxy.GetDefaultProxy(); 
    oWsGetInfo.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 
    // Invoke the web service 
    return oWsGetInfo.GetInfo4Me(searchCriteria); 
} 

कि उदाहरण के लिए अपने वेब सेवा लागू करने से पहले डिफ़ॉल्ट प्रॉक्सी सेटिंग और साख मिल जाएगा।

2

मेरी अनुरोध प्रॉक्सी को WebRequest.GetSystemWebProxy() पर सेट करने से समस्या हल हो गई।

WebProxy.GetDefaultProxy() वास्तविक तरीका है लेकिन अब इसे बहिष्कृत किया गया है।

2
<system.net> 
<defaultProxy enabled="false" useDefaultCredentials="false"> 
    <proxy/> 
    <bypasslist/> 
    <module/> 
</defaultProxy> 

application.config फ़ाइल में इस स्निपेट का उपयोग।

+0

+1। यह मेरे लिए काम किया। विफलता की पहचान करने के लिए सक्षम ट्रेसिंग (यूरी के लिए प्रॉक्सी सेटिंग्स पुनर्प्राप्त नहीं कर सकता)। फिर, डिफ़ॉल्ट प्रॉक्सी (डोमेन नीति द्वारा अमान्य यूरी पर सेट) का उपयोग किया जा रहा था और तुरंत विफल रहा था। मैंने उपरोक्त सेटिंग्स और बूम का इस्तेमाल किया। फिक्स्ड। –

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