2012-06-11 31 views
13

के माध्यम से प्रमाणीकृत अनुरोधों में विफल रहा है हम HTTPWebRequest ऑब्जेक्ट्स का उपयोग हमारे आवेदन पर HTTP अनुरोध करने के लिए कर रहे हैं और अनुरोध में प्रमाणीकरण की आवश्यकता होने पर हमें समस्या हो रही है और एक पारदर्शी प्रॉक्सी (स्क्विड 3.1.10)।HTTPWebRequest.GetResponse() एक पारदर्शी प्रॉक्सी

string url = "http://www.icode.co.uk/test/auth.php"; 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
request.Credentials = new NetworkCredential("username", "password"); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
Stream stream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(stream); 

MessageBox.Show(reader.ReadToEnd()); 

reader.Close(); 
stream.Close(); 
response.Close(); 

हमारे मूल कोड WebClient वर्ग जो एक ही समस्या का प्रदर्शन किया करते थे।

पहली बार यह कोड चलता है, यह परिणाम सही ढंग से प्रदर्शित करता है। कोड को दूसरी बार चलता है, इसके साथ GetResponse() लाइन पर विफल रहता है:

System.Net.WebException was unhandled 
    Message="The server committed a protocol violation. Section=ResponseStatusLine" 
    Source="System" 
    StackTrace: 
     at System.Net.HttpWebRequest.GetResponse() 
     at Dummy.DummyForm.button1_Click(Object sender, EventArgs e) in H:\Trial\Dummy\DummyForm.cs:line 42 
     at ... 

विंडोज 7 पर, प्रक्रिया को पुन: प्रारंभ यह ठीक है और एक बार काम करने के लिए कारण बनता है, लेकिन सर्वर 2003 में एक पूर्ण रिबूट की आवश्यकता है।

network capture को देखते हुए, दो अनुरोध, के साथ प्रारंभिक अप्रमाणित अनुरोध भेज दिया जाता है और सर्वर उत्तर, लेकिन नाकाम रहने के अनुरोध के रूप में अगर यह Content-Length अनदेखी है प्रारंभिक जबाब के बीच में 2 प्रमाणीकृत अनुरोध भेजता है शुरू करने के लिए समान हैं हेडर (जो सही है)। इसके बाद शेष प्रारंभिक उत्तर प्राप्त होता है और प्रोटोकॉल त्रुटि के साथ विफल रहता है।

Wireshark capture

यह अजीब है कि ग्राहक (HTTPWebRequest) कनेक्शन बंद नहीं होती है सफाई से हालांकि प्रतीत होता है।

जब प्रॉक्सी उपयोग में नहीं है (गैर पोर्ट 80 या आंतरिक यातायात) अनुरोध सभी अपेक्षित कार्य करते हैं। जब कोई प्रमाणीकरण नहीं होता है, तो यह भी काम करता है क्योंकि यह केवल एक ही अनुरोध करता है।

मैंने पहले से ही समस्या कोड को कम से कम कर दिया है और इसे एमएसडीएन नमूना के साथ पुन: उत्पन्न किया है, लेकिन क्या किसी को पता है कि यह ज्ञात समस्या है या हमारे (.NET या Squid) कॉन्फ़िगरेशन में कोई समस्या है?

+0

यह सुनिश्चित नहीं है कि यह समस्या कहां है, लेकिन क्या आप अपना स्ट्रीमरडर बंद करने के दौरान सुनिश्चित कर रहे हैं? –

+0

स्क्रीनशॉट जोड़ने के लिए धन्यवाद। क्या आपने प्राधिकरण की जानकारी को पहले जीईटी से बाहर कर दिया था, या क्या इसमें कोई भी शामिल नहीं था? –

+0

मैंने अपना जवाब हटा दिया है, क्योंकि यह स्पष्ट है कि यह लागू नहीं होता है। –

उत्तर

1

चूंकि यह केवल दूसरी बार विफल रहता है,

request.KeepAlive = false; 

एक फर्क होता?

+0

यह [करता है] (http://stackoverflow.com/questions/10984264/httpwebrequest-getresponse-failing-with- प्रमाणीकृत- अनुरोध-through-a-trans/11190526#comment14393611_10984264) लेकिन मैं इसका उपयोग करने के लिए अनिच्छुक हूं स्थायी समस्या के रूप में यह प्रारंभिक समस्या के लिए एक फिक्स के बजाय एक समाधान के अधिक है। मैं वैसे भी इसे स्वीकार करूंगा – Deanna

0

मुझे लगता है कि एनटीएलएम प्रमाणीकरण (नेटवर्क क्रेडेंशियल) एक ही समय में स्क्वाइड की पारदर्शी प्रॉक्सी सुविधा के साथ काम नहीं करता है। :-(

http://www.squid-cache.org/mail-archive/squid-users/201110/0025.html

यदि आप किसी अन्य प्रमाणीकरण योजना की कोशिश कर सकता है?

+0

मैं एनटीएलएम प्रमाणीकरण का उपयोग नहीं कर रहा हूं। 'नेटवर्क क्रेडेंशियल' ऑब्जेक्ट योजना अज्ञेयवादी है। प्रॉक्सी को प्रमाणित नहीं किया गया है, केवल मूल संसाधन जो हम अनुरोध कर रहे हैं, मूल प्रमाणीकरण के साथ। – Deanna

0

खुद के सत्यापन का प्रयास करें ,

request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password)); 
के साथ

से पहले request.GetResponse();

यह मेरे लिए काम किया। सबसे पहले मैंने पूरी स्ट्रिंग में खुद को डालने की कोशिश की, जो काम नहीं किया!