2013-07-27 8 views
7

मैं .NET System.Net.Http.HttpClient का उपयोग कर हेरोकू एपीआई के साथ प्रयोग कर रहा हूं। विशेष रूप से, मुझे काम करने के लिए keep-alive चाहिए ताकि मैं एक टीसीपी कनेक्शन का उपयोग करके कई HTTP अनुरोध भेज सकूं और प्रति अनुरोध एसएसएल हैंडशेक के साथ एक टीसीपी कनेक्शन स्थापित करने के बजाय केवल एक एसएसएल हैंडशेक कर सकता हूं।कनेक्शन कुछ जीवों पर System.Net.Http.HttpClient के साथ काम नहीं कर रहा है

मैं https://api.heroku.com/status के खिलाफ परीक्षण कर रहा हूं जो एक अच्छा HTTP 200 देता है, और टीसीपी यातायात की निगरानी के लिए वायरशर्क का उपयोग करता है।

Google क्रोम, अपाचेबेन्च (-k ध्वज के साथ) और कर्ल सभी एक टीसीपी कनेक्शन खोलने और एकाधिक अनुरोध भेजने में सक्षम होने लगते हैं। HttpClient, इतना नहीं। मैं भी (HttpClient अन्य मेजबान के खिलाफ परीक्षण किया है जैसे। https://google.com/ और वहाँ मैं केवल एक एसएसएल हाथ मिलाना/टीसीपी सेटअप देखते हैं। तो ऐसा लगता है यह HttpClient और Heroku एपीआई के बीच एक बुरी बातचीत है जैसे।

यहाँ कोड मैं परीक्षण हूँ साथ:

private static async void TestUrl(string url) 
{ 
    using (var client = GetClient()) 
    { 
     await client.GetAsync(url); 
     await client.GetAsync(url); 
     await client.GetAsync(url); 
     await client.GetAsync(url); 
    } 
} 

private static HttpClient GetClient() 
{ 
    var requestHandler = new HttpClientHandler 
    { 
     UseCookies = false, 
     AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip, 
    }; 

    return new HttpClient(requestHandler); 
} 

मैं भी दिखा कैसे HttpClient रूप में जल्द ही पुनर्स्थापित करने के लिए (RST) कनेक्शन के रूप में यह डेटा प्राप्त किया है फैसला करता है एक Wireshark स्क्रीनशॉट संलग्न कर रहा हूँ

Wireshark screenshot

यहां क्या हो रहा है के लिए कोई सुझाव?

+0

फिडलर क्या दिखाता है? यदि वे HTTP 1.0 पर बातचीत करते हैं, तो आपको एक स्पष्ट Keep-Alive शीर्षलेख की आवश्यकता है। –

+0

@StephenCleary Google क्रोम HTTP/1.1 – friism

+0

दिखाता है जिसका अर्थ है 'एचटीपी क्लाइंट' और हेरोोकू के बीच। –

उत्तर

0

कुछ प्रॉक्सी सर्वर अपने प्रमाणीकरण करते समय रख-रखाव को अनदेखा कर देंगे। अगर मुझे सही याद आती है तो यह तब होता है जब प्रॉक्सी सर्वर एनटीएलएम प्रमाणीकरण का उपयोग करता है।

अतीत में, मुझे कुछ वेब सेवा प्रॉक्सी कक्षाओं में "सहायता" करने के लिए आंशिक कक्षा जोड़नी पड़ती है।

मैं

System.Net.HttpWebRequest webRequest = 
     (System.Net.HttpWebRequest)base.GetWebRequest(uri); 
webRequest.ProtocolVersion = HttpVersion.Veraion10; // I know this is strange, but it works 
webRequest.ServicePoint.Expect100Continue = false; // This is where the magic lives 
return webRequest; 
संबंधित मुद्दे