2010-01-25 21 views
8

पर कॉल करते समय HTTP 407 प्रॉक्सी प्रमाणीकरण त्रुटि मैं एक .NET ऐप पर काम कर रहा हूं जो इंटरनेट पर तृतीय पक्ष वेब सेवाओं को कॉल करता है। सेवाएं SOAP का उपयोग नहीं करती हैं, इसलिए हम मैन्युअल रूप से एक XML अनुरोध दस्तावेज़ बनाते हैं, इसे HTTP के माध्यम से सेवा में भेजते हैं, और एक XML प्रतिक्रिया पुनर्प्राप्त करते हैं।वेब सेवा

हमारा कोड एक विंडोज सेवा है जो एक सामान्य विंडोज डोमेन खाते के संदर्भ में चलाया जाता है, और एनटीएलएम प्रमाणीकरण की आवश्यकता के लिए कॉन्फ़िगर किए गए प्रॉक्सी सर्वर (माइक्रोसॉफ्ट आईएसए सर्वर) के पीछे बैठता है। हमारे सेवा को चलाने वाले खाते में प्रॉक्सी सर्वर के माध्यम से इंटरनेट तक पहुंचने की अनुमति है।

कोड इस तरह दिखता है:

// Create the request object. 
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); 
request.Method = "POST"; 

// Configure for authenticating proxy server requiring Windows domain credentials. 
request.Proxy = New WebProxy(proxyAddress) { UseDefaultCredentials = true }; 

// Set other required headers. 
request.Accept = acceptableMimeType; 
request.Headers.Add(HttpRequestHeader.AcceptCharset, acceptableCharset); 
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "none"); 
request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-gb"); 
request.Headers.Add(HttpRequestHeader.CacheControl, "no-store"); 
request.Headers.Add(HttpRequestHeader.ContentEncoding, "none"); 
request.Headers.Add(HttpRequestHeader.ContentLanguage, "en-gb"); 
request.ContentType = requestMimeType; 
request.ContentLength = requestBytes.Length; 

// Make the method call. 
using(Stream stream = request.GetRequestStream()) { 
    stream.Write(requestBytes, 0, requestBytes.Length); 
} 
HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 

// Extract the data from the response without relying on the HTTP Content-Length header 
// (we cannot trust all providers to set it correctly). 
const int bufferSize = 1024 * 64; 
List<byte> responseBytes = new List<byte>(); 
using(Stream stream = new BufferedStream(response.GetResponseStream(), bufferSize)) { 
    int value; 
    while((value = stream.ReadByte()) != -1) { 
     responseBytes.Add((byte) value); 
    } 
} 

यह ठीक काम करता है, तो प्रॉक्सी सर्वर बंद कर दिया है, या URL प्रमाणीकरण की आवश्यकता नहीं के रूप में श्वेतसूचीबद्ध किया गया है, लेकिन जैसे ही प्रमाणीकरण सक्रिय है, यह हमेशा विफल रहता है एक HTTP 407 त्रुटि के साथ।

मैंने उपर्युक्त कोड को परीक्षण दोहन में रखा है, और बिना किसी सफलता के request.Proxy संपत्ति को कॉन्फ़िगर करने के लिए हर विधि की कोशिश की।

मैंने तब देखा कि सभी तृतीय पक्ष वेब सेवाओं को जिन्हें हमें कॉल करना है, वे HTTPS हैं। जब मैंने उन्हें HTTP के रूप में एक्सेस करने का प्रयास किया, तो प्रॉक्सी प्रमाणीकरण काम करना शुरू कर दिया। क्या कुछ अतिरिक्त उछाल है मुझे प्रॉक्सी प्रमाणीकरण और एचटीटीपीएस को अच्छी तरह से खेलने के लिए कूदना है?

पीएस: ओपन सोर्स स्मूथवॉल प्रॉक्सी सर्वर के साथ एक ही समस्या होती है, इसलिए मैं इसे आईएसए सर्वर में एक बग के रूप में नहीं लिख सकता।

पीपीएस: मुझे पता है कि आप app.config में प्रॉक्सी सेटिंग्स कॉन्फ़िगर कर सकते हैं, लेकिन (ए) कोड में इसे करने से कोई फर्क नहीं पड़ता है, और (बी) एप्लिकेशन डिज़ाइन की आवश्यकता है कि हम प्रॉक्सी सेटिंग्स को पढ़ लें रनटाइम पर डेटाबेस।

उत्तर

2

मुझे लगता है कि मुझे यह प्रश्न लिखना होगा। मेरा मूल पोस्ट कोड कभी-कभी काम करने लगता है। हमारा प्रॉक्सी सर्वर बेहद अविश्वसनीय है; एक मिनट यह किसी भी सॉफ्टवेयर से इंटरनेट कनेक्शन को अवरुद्ध कर देगा, और अगला यह इसे अनुमति देगा। आईटी लोग इसके बारे में कुछ भी करने के लिए शक्तिहीन लगते हैं, और हम (आईटी विभाग के बाहर हर किसी के पास) नेटवर्क बुनियादी ढांचे में बदलाव करने का कोई अधिकार नहीं है।

अगर किसी के पास अविश्वसनीय प्रॉक्सी सर्वर की क्षतिपूर्ति करने के लिए मेरे कोड को "कड़ी" करने के बारे में कोई विचार है, तो मुझे उन्हें सुनना होगा। :-)

+0

जो मेरे मामले में बिल्कुल होता है। कुछ समय मैं इस त्रुटि के बिना कनेक्ट करने में सक्षम हूं। –

+3

जो इस पर घूमते हैं उनके लिए समस्या निवारण युक्ति के रूप में पोस्ट करना: यह प्रॉक्सी सर्वर कॉन्फ़िगर/सॉफ़्टवेयर हो सकता है, लेकिन इस तरह के अंतःस्थापित मुद्दों में पहली जांच आंशिक क्लस्टर विफलता को खत्म कर देती है। यदि लोड बैलेंसर के पीछे कई प्रॉक्सी सर्वर हैं, और केवल एक को ठीक से कॉन्फ़िगर किया गया है, तो आप केवल "अच्छा" उदाहरण, उर्फ ​​को संतुलित करते समय ही प्राप्त करेंगे। कभी कभी। – Barryrowe

9

क्या आपने app.config में प्रॉक्सी सेट करने का प्रयास किया है?

प्रॉक्सी को अक्षम करने के App.config फ़ाइल में निम्न कॉन्फ़िगरेशन

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

प्रॉक्सी सक्षम करने के लिए और डिफ़ॉल्ट प्रॉक्सी सेटिंग का उपयोग (आईई में निर्दिष्ट) अपने App.config में इस विन्यास जोड़ने

<system.net> 
    <defaultProxy enabled="true" useDefaultCredentials="true"> 
    <proxy/> 
    <bypasslist/> 
    <module/> 
    </defaultProxy> 
</system.net> 
+1

मैंने कोशिश की है, और मुझे एक ही परिणाम मिल गए हैं। यह HTTP पते के लिए ठीक काम करता है, लेकिन HTTPS के लिए विफल रहता है। –

0

क्या आपके प्रॉक्सी सर्वर के प्रमाणपत्र में कुछ गड़बड़ है? यदि आपकी सेवा HTTPS स्थापित नहीं कर सकती है तो यह एक त्रुटि फेंक देगा।

+0

मैंने इसके बारे में हमारे आईटी व्यवस्थापक से पूछा है, और वे कहते हैं कि यह निश्चित रूप से एसएसएल का समर्थन करने के लिए कॉन्फ़िगर किया गया है। उन्होंने प्रॉक्सी सर्वर के माध्यम से सफलतापूर्वक एक HTTPS वेब साइट पर ब्राउज़ किया। –

3

मैं एक ऐसी ही स्थिति

क्या आप देखा कि यह काम किया है जब आप इंटरनेट तक पहुंच बनाने से पहले आप कोड भाग गया था? और यदि आपने उम्र के लिए इंटरनेट तक नहीं पहुंचाया है (मेरे लिए 20 मिनट) तो आपको त्रुटि मिली है।

क्या आपने प्रॉक्सी प्रमाण-पत्र सीधे सेट करने का प्रयास किया है?

//setup the proxy 
request.Proxy = new WebProxy("proxyIp", 8080); 
request.Proxy.Credentials = CredentialCache.DefaultCredentials; 

मैंने हाल ही में blogged इस बारे में बताया।

मुझे आशा है कि यह आपकी समस्या को भी ठीक करेगी!

+0

हाय डबोन, आपके अनुभव को साझा करने के लिए धन्यवाद! दुर्भाग्यवश मैंने प्रॉक्सी सर्वर अचानक अचानक विफल होने के बाद भी देखा है, सफल कनेक्शन केवल कुछ सेकंड पहले किए गए थे। इसके अलावा मैंने वास्तव में कोड में प्रॉक्सी को परिभाषित करने की सटीक विधि की कोशिश की है, और इससे कोई फर्क नहीं पड़ता। –

+0

वाह, मुझे कहना नफरत है, लेकिन उपरोक्त मेरे मुद्दे को ठीक किया गया है। मुझे आशा है कि आप अपनी स्थिति के लिए एक प्रस्ताव पा सकते हैं – dbones