2013-05-24 7 views
9

मैं API कॉल निम्नलिखित के साथ MtGox से व्यापार के इतिहास को पुनः प्राप्त करने के लिए एक सरल सी # समारोह लिखा है:HttpWebRequest.GetResponse() का समय समाप्त हो रही रखता है

https://data.mtgox.com/api/1/BTCUSD/trades?since=<trade_id> 

यहाँ प्रलेखित: https://en.bitcoin.it/wiki/MtGox/API/HTTP/v1#Multi_currency_trades

यहाँ

समारोह है:

string GetTradesOnline(Int64 tid) 
{ 
    Thread.Sleep(30000); 

    // communicate 
    string url = "https://data.mtgox.com/api/1/BTCUSD/trades?since=" + tid.ToString(); 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    StreamReader reader = new StreamReader(response.GetResponseStream()); 

    string json = reader.ReadToEnd(); 
    reader.Close(); 
    reader.Dispose(); 
    response.Close(); 

    return json; 
} 

मैं डेटा प्राप्त करने के लिए tid = 0 (व्यापार आईडी) से शुरू कर रहा हूं (शुरुआत से)। प्रत्येक अनुरोध के लिए, मुझे 1000 व्यापार विवरण वाले एक प्रतिक्रिया प्राप्त होती है। मैं हमेशा अगले अनुरोध के लिए पिछली प्रतिक्रिया से व्यापार आईडी भेजता हूं। यह ठीक 4 अनुरोध & प्रतिक्रियाओं के लिए ठीक काम करता है। लेकिन उसके बाद, निम्न पंक्ति एक "System.Net.WebException" फेंकता है, कह रही है कि "प्रचालन का समय समाप्त हो गया है":

  • अपवाद को पकड़ने और retying:

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    

    यहाँ तथ्य हैं एक ही अपवाद के कारण रहता है

  • डिफ़ॉल्ट HttpWebRequest .Timeout और .ReadWriteTimeout पहले से ही काफी अधिक (एक मिनट से अधिक)
  • गलत पर HttpWebRequest.KeepAlive बदलते कुछ भी या तो
  • का समाधान नहीं कर रहे हैं 0
  • यह यहाँ तक कि जब समारोह
  • विफल हो रहा है हमेशा ब्राउज़र में काम करने लगता है यह दिन प्रतिदिन बदलता रहता है अपवाद से पहले https://www.google.com
  • सफल प्रतिक्रियाओं की राशि से प्रतिक्रिया retrieveing ​​कोई समस्या नहीं है (लेकिन ब्राउज़र हमेशा काम करता है)
  • व्यापार आईडी कि पिछली बार विफल रहा है पर शुरू अपवाद तुरंत
  • मुख्य थ्रेड से इस कार्यप्रणाली को कॉल के बजाय अभी भी अपवाद
  • किसी दूसरी मशीन पर इसे चलाने की वजह से काम नहीं किया
  • आरयू का कारण बनता है एक अलग आईपी से nning
  • काम नहीं किया Thread.Sleep बढ़ती inbetween अनुरोध

क्या गलत हो सकता है की किसी भी विचार मदद नहीं करता है?

उत्तर

13

दो प्रकार के टाइमआउट हैं। क्लाइंट टाइमआउट और सर्वर टाइमआउट।

request.Timeout = Timeout.Infinite; 
request.KeepAlive = true; 

कुछ इस तरह का प्रयास करें ...

+0

मैंने अभी सुझाव दिया कि आपने जो सुझाव दिया है। इस बार 5 जवाब लोड हुए, इसलिए यह एक सुधार की तरह लगता है। लेकिन फिर मैं एक "रिमोट सर्वर को एक त्रुटि लौटा रहा है: (504) गेटवे टाइमआउट" संदेश (जो "ऑपरेशन का समय समाप्त हो गया है" से अलग है) – symbiont

+0

मुझे लगता है कि सर्वर सर्वर पर यह समस्या है? – symbiont

+0

कभी नहीं। यह अभी भी मेरे ब्राउज़र (फ़ायरफ़ॉक्स) में काम कर रहा है। – symbiont

5

मैं सिर्फ समान ssl के माध्यम से एक लिनक्स सर्वर पर एक बाकी सेवा बुला मुसीबतों था: आप कुछ इस तरह कर रही कोशिश की है। कई अलग-अलग कॉन्फ़िगरेशन परिदृश्यों को आजमाने के बाद मुझे पता चला कि मुझे http हेड में UserAgent भेजना था।

आरईएसटी एपीआई को कॉल करने के लिए मेरी अंतिम विधि यहां दी गई है।

 private static string RunWebRequest(string url, string json) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 

     // Header 
     request.ContentType = "application/json"; 
     request.Method = "POST"; 
     request.AllowAutoRedirect = false; 
     request.KeepAlive = false; 
     request.Timeout = 30000; 
     request.ReadWriteTimeout = 30000; 
     request.UserAgent = "test.net"; 
     request.Accept = "application/json"; 
     request.ProtocolVersion = HttpVersion.Version11; 
     request.Headers.Add("Accept-Language","de_DE"); 
     ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; 
     ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 
     byte[] bytes = Encoding.UTF8.GetBytes(json); 
     request.ContentLength = bytes.Length; 
     using (var writer = request.GetRequestStream()) 
     { 
      writer.Write(bytes, 0, bytes.Length); 
      writer.Flush(); 
      writer.Close(); 
     } 

     var httpResponse = (HttpWebResponse)request.GetResponse(); 
     using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
     { 
      var jsonReturn = streamReader.ReadToEnd(); 
      return jsonReturn; 
     } 
    } 
11

मेरे पास एक ही समस्या थी। मेरे लिए यह ब्लॉक ब्लॉक का उपयोग करने में HttpWebResponse कोड को लपेटने के समान सरल था।

using (HttpWebResponse response = (HttpWebResponse) request.GetResponse()) 
{ 
    // Do your processings here.... 
} 

विवरण: यह समस्या आमतौर पर तब होता है जब कई अनुरोध एक समान होस्ट से बने हैं, और WebResponse ठीक से निपटारा नहीं किया गया है। यही वह जगह है जहां using ब्लॉक ठीक से WebResponse ऑब्जेक्ट को सही तरीके से निपटान करेगा और इस प्रकार समस्या को हल करेगा।

+0

क्या आप समझा सकते हैं कि एक प्रयोग ब्लॉक में इसे लपेटने से व्यवहार क्यों बदलेगा? –

+1

हाय @RussellMcDonnell। यह समस्या आमतौर पर तब होती है जब आप एक ही होस्ट को कई अनुरोध करते हैं, और 'WebResponse' ठीक तरह से निपटान नहीं किया जाता है। यही कारण है कि उपयोग ब्लॉक एक उद्धारकर्ता के रूप में यहां आता है। – Habeeb

0

इसके लायक होने के लिए, जब भी मैं इसे इस्तेमाल करता था, तब भी मुझे टाइमआउट के साथ एक ही समस्या का सामना करना पड़ रहा था, भले ही कॉल सर्वर पर जा रहा था। मेरे मामले में समस्या यह थी कि मुझे एप्लिकेशन/जेसन पर सेट की उम्मीद थी, जब वह सर्वर वापस नहीं लौटा रहा था।

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