31

मैं प्रॉक्सी के साथ काम कर रहा हूं जिसके लिए प्रमाणीकरण की आवश्यकता है, यानी, यदि मैं एक पृष्ठ खोलने का प्रयास करता हूं तो यह तुरंत क्रेडेंशियल्स मांगेगा। मैंने अपने प्रोग्राम में समान प्रमाण-पत्र प्रदान किए लेकिन यह HTTP 407 त्रुटि के साथ विफल रहता है।सी # में प्रॉक्सी बेसिक प्रमाणीकरण: HTTP 407 त्रुटि

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 

IWebProxy proxy = WebRequest.GetSystemWebProxy(); 
CredentialCache cc = new CredentialCache(); 
NetworkCredential nc = new NetworkCredential(); 

nc.UserName = "userName"; 
nc.Password = "password"; 
nc.Domain = "mydomain"; 
cc.Add("http://20.154.23.100", 8888, "Basic", nc); 
proxy.Credentials = cc; 
//proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 
request.Proxy = proxy; 
request.Proxy.Credentials = cc; 
request.Credentials = cc; 
request.PreAuthenticate = true; 

मैं हर संभव कोशिश की, लेकिन बात लग रहे है कि मैं कुछ याद आ रही है है

यहाँ मेरी कोड है। क्या ऐसा कुछ है, मुझे दो अनुरोध करना है? सबसे पहले प्रमाण पत्र के साथ और एक बार जब मैं प्रमाण पत्र की आवश्यकता के बारे में सर्वर से वापस सुनता हूं, तो क्रेडेंशियल के साथ एक ही अनुरोध करें?

+0

आपके प्रॉक्सी सर्वर की क्या प्रमाणीकरण योजना की आवश्यकता है? बेसिक? NTLM? –

+0

मूलभूत, यही कारण है कि मैंने क्रेडिट कैश में मूल का उपयोग किया ... – rplusg

उत्तर

17

यहाँ creds के साथ प्रॉक्सी का प्रयोग का सही तरीका है ..

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 

IWebProxy proxy = request.Proxy;      
if (proxy != null) 
{ 
    Console.WriteLine("Proxy: {0}", proxy.GetProxy(request.RequestUri)); 
} 
else 
{ 
    Console.WriteLine("Proxy is null; no proxy will be used"); 
} 

WebProxy myProxy = new WebProxy(); 
Uri newUri = new Uri("http://20.154.23.100:8888"); 
// Associate the newUri object to 'myProxy' object so that new myProxy settings can be set. 
myProxy.Address = newUri; 
// Create a NetworkCredential object and associate it with the 
// Proxy property of request object. 
myProxy.Credentials = new NetworkCredential("userName", "password"); 
request.Proxy = myProxy; 

धन्यवाद मदद के लिए हर किसी को ... :)

+7

यह केवल तभी सही है जब आप अपने उपयोगकर्ता को अपने प्रॉक्सी सर्वर पते और पोर्ट नंबर को खोजने के लिए बाध्य करना चाहते हैं, और अपने एप्लिकेशन में अपना उपयोगकर्ता नाम और पासवर्ड टाइप करें, और अपना आवेदन इसे कहीं भी स्टोर करने के लिए (या तो स्पष्ट या जरूरी रूप से उलटा एन्क्रिप्शन का उपयोग करना) - शायद ही आदर्श - क्लीनर विधि के लिए मेरा उत्तर जांचें जो शायद अधिकांश परिदृश्यों में काम करेगा। – tomfanning

+1

अपने ऐप में प्रॉक्सी पता और क्रेडेंशियल्स संग्रहीत करना एक अच्छा विचार नहीं है - अन्य दो उत्तरों में से कोई भी –

+0

से बेहतर है, मैं सहमत हूं, यह सही उत्तर नहीं है। –

69

इस विधि कठिन कोड की जरूरत से बचने या प्रॉक्सी साख कॉन्फ़िगर कर सकते हैं , जो वांछनीय हो सकता है।

इसे अपनी एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल में रखें - शायद app.config। विजुअल स्टूडियो इसे बिल्ड पर yourappname.exe.config पर पुनर्नामित करेगा, और यह आपके निष्पादन योग्य के बगल में समाप्त हो जाएगा। यदि आपके पास कोई एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल नहीं है, तो केवल विजुअल स्टूडियो में नया आइटम जोड़ें का उपयोग करके एक जोड़ें।

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.net> 
    <defaultProxy useDefaultCredentials="true" /> 
    </system.net> 
</configuration> 
+0

यह काम करता है, लेकिन मुझे प्रॉक्सी यूआरएल प्रदान करना पड़ा। – Vanuan

+0

यह मेरे लिए पूरी तरह से काम किया। अनेक अनेक धन्यवाद! – MrBubbles

+0

हां यह बेहतर तरीका है। क्योंकि आपको अपने कोड में प्रमाण-पत्र जोड़ने की आवश्यकता नहीं है। +1 ..निर्बाध रूप से काम करता है – csharpcoder

18

मैं एक बहुत ही इसी तरह की स्थिति जहां HttpWebRequest डिफ़ॉल्ट रूप से सही प्रॉक्सी विवरण उठा नहीं किया गया हो रही थी और सेटिंग UseDefaultCredentials या तो काम नहीं किया। कोड में सेटिंग्स जबरदस्ती लेकिन एक इलाज काम किया:

IWebProxy proxy = myWebRequest.Proxy; 
if (proxy != null) { 
    string proxyuri = proxy.GetProxy(myWebRequest.RequestUri).ToString(); 
    myWebRequest.UseDefaultCredentials = true; 
    myWebRequest.Proxy = new WebProxy(proxyuri, false); 
    myWebRequest.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 
} 

और क्योंकि यह डिफ़ॉल्ट क्रेडेंशियल का उपयोग करता यह उनकी जानकारी के लिए उपयोगकर्ता पूछना नहीं करना चाहिए।

+0

यह मेरे कंसोल एप्लिकेशन में काम करता है हालांकि यह मेरे .NET applicaiton में HTTPS का समर्थन नहीं करता है। टॉमफैनिंग का समाधान काम करता है। धन्यवाद! – Smeiff

2

यह समस्या मुझे वर्षों से परेशान कर रही थी, मेरे लिए एकमात्र कामकाज हमारे नेटवर्क टीम से हमारे फ़ायरवॉल पर अपवाद बनाने के लिए कहा गया था ताकि कुछ यूआरएल अनुरोधों को प्रॉक्सी पर प्रमाणीकृत करने की आवश्यकता न हो जो आदर्श नहीं है।

हाल ही में मैं 3.5 से नेट से 4 परियोजना के लिए उन्नत और कोड सिर्फ प्रॉक्सी के लिए डिफ़ॉल्ट क्रेडेंशियल्स का उपयोग काम करना शुरू किया, साख आदि

request.Proxy.Credentials = CredentialCache.DefaultCredentials; 
-1

का कोई hardcoding इस

कोशिश
 var YourURL = "http://yourUrl/"; 

     HttpClientHandler handler = new HttpClientHandler() 
     { 
      Proxy = new WebProxy("http://127.0.0.1:8888"), 
      UseProxy = true, 
     }; 

     Console.WriteLine(YourURL); 

     HttpClient client = new HttpClient(handler);