2016-10-25 14 views
5

एक अन्य प्रश्न में, GetResponseStream() के माध्यम से HttpWebResponse से पढ़ने पर लोगों को अपूर्ण डेटा मिल रहा है।HttpWebResponse डेटा खोने क्यों है?

मुझे एम्बेडेड डिवाइस से डेटा पढ़ने के दौरान भी इस समस्या का सामना करना पड़ा, जो मुझे 1000 इनपुट की कॉन्फ़िगरेशन भेजना चाहिए, सभी 32 बाइट हेडर और 64 बाइट्स * 1000 में डेटा के 64032 बाइट्स के परिणामस्वरूप।

प्रतिक्रिया स्ट्रीम पढ़ना सीधे मुझे केवल शून्य पर पहले 61 और आधे इनपुट के लिए डेटा देता है।

संस्करण क) काम नहीं कर:

int headerSize = 32; 
int inputSize = 64; 
byte[] buffer = new byte[(inputSize*1000) + headerSize]; 

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

using (Stream stream = response.GetResponseStream()) 
{ 
    if (stream != null) 
    { 
     stream.Seek(0, SeekOrigin.Begin); 
     stream.Read(buffer, 0, buffer.Length); 
    } 
} 

response.Close(); 
return buffer; 

समस्या कल्पना करने के लिए, मैं अलग से प्रत्येक इनपुट विन्यास के लिए 64 बाइट्स छपी। इसमें मूल रूप से 40 एसीसी वर्ण और कुछ बाइट होते हैं जो बूलियन और पूर्णांक मानों का प्रतिनिधित्व करते हैं।

संस्करण ए) आउटपुट:

1/1000 | 46656E7374657220576F686E656E2020202020202020202020202020202020202020202020202020000000000F0EB0AA00008100000001800000100090010020 
2/1000 | 42574D20576F686E656E202020202020202020202020202020202020202020202020202020202020000000000F0EB0AA00008100000001800000100091010080 
… 
61/1000 | 53656E736F72203631202020202020202020202020202020202020202020202020202020202020200000000000000000000010003300000000001000C3010000 
62/1000 | 53656E736F7220363220202020202020202020202020202020202020202020200000000000000000000000000000000000000000000000000000000000000000 
63/1000 | 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 
… 
999/1000 | 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 
1000/1000 | 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 

जब मैं किसी नए MemoryStream को ResponseStream नकल, मैं सभी 1000 आदानों पूरी तरह से किसी भी भ्रष्ट बाइट्स के बिना पढ़ सकते हैं।

संस्करण बी) पूरी तरह से कार्य करना:

(यह भी देखें https://stackoverflow.com/a/22354617/6290907 जो पहले मामले में मेरी समस्या)

int headerSize = 32; 
int inputSize = 64; 
byte[] buffer = new byte[(inputSize*1000) + headerSize]; 

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

using (Stream stream = response.GetResponseStream()) 
{ 
    if (stream != null) 
    { 
     MemoryStream memStream = new MemoryStream(); 
     stream.CopyTo(memStream); 
     memStream.Flush(); 
     stream.Close(); 

     memStream.Seek(0, SeekOrigin.Begin); 
     memStream.Read(buffer, 0, buffer.Length); 

     memStream.Close(); 
    } 
} 

response.Close(); 
return buffer; 

संस्करण बी) आउटपुट

1/1000 | 46656E7374657220576F686E656E2020202020202020202020202020202020202020202020202020000000000F0EB0AA00008100000001800000100090010020 
2/1000 | 42574D20576F686E656E202020202020202020202020202020202020202020202020202020202020000000000F0EB0AA00008100000001800000100091010080 
… 
61/1000 | 53656E736F72203631202020202020202020202020202020202020202020202020202020202020200000000000000000000010003300000000001000C3010000 
62/1000 | 53656E736F72203632202020202020202020202020202020202020202020202020202020202020200000000000000000000010003300000000001000C3010000 
63/1000 | 53656E736F72203633202020202020202020202020202020202020202020202020202020202020200000000000000000000010003300000000001000C3010000 
… 
999/1000 | 53656E736F7220393939202020202020202020202020202020202020202020202020202020202020000000000000000000001000DA030000000010006A050000 
1000/1000 | 53656E736F7220313030302020202020202020202020202020202020202020202020202020202020000000000000000000001000DB030000000010006B050000 

तय एक तकनीकी से दृष्टिकोण: HttpWebResponse सीधे पहुंचने पर डेटा खोने क्यों है? मैं सिर्फ यह काम नहीं करना चाहता, लेकिन मैं समझना चाहता हूं कि संस्करण विफल क्यों होता है और संस्करण बी सफल होता है जबकि दोनों डेटा के उसी स्रोत (प्रतिक्रिया.गेट्रॉस्पॉन्सस्ट्रीम()) पर निर्भर करते हैं। इस मामले में हुड के तहत क्या हो रहा है?

आपके प्रयासों के लिए धन्यवाद!

उत्तर

2

जांच int रूप docs वर्णन करते हैं, Stream.Read द्वारा दिया:

यह अनुरोध किया बाइट की संख्या की तुलना में कम हो सकता है कि कई बाइट्स वर्तमान में उपलब्ध नहीं हैं, या शून्य (0) अगर धारा के अंत में पहुंच गया है।

मैं शर्त लगाता हूं कि स्ट्रीम का केवल एक हिस्सा पहले कॉल में वापस किया जाता है।

यदि आपने बार-बार Stream.Read कहा है, तो आपको अंत में सभी बाइट मिलेंगे। Http स्ट्रीम आपके कोड चलने से अधिक धीरे-धीरे लोड हो रहा है - Read पर कॉल करने से पहले इसे पूरा करने का समय नहीं है।

CopyToMemoryStream के साथ MemoryStream का उपयोग करके, संपूर्ण स्ट्रीम पढ़े जाने तक कॉल ब्लॉक।StreamReader में लपेटना, फिर ReadToEnd पर कॉल करना वही सफल परिणाम प्राप्त होगा।

+0

int बाइट्स रीड = 0; int बाइट्स टॉरेड = बफर। लम्बाई; { int n = s.Read (बफर, बाइट्स रीड, बाइट्स टू रीड); बाइट्स रीड + = एन; बाइट्स टॉरेड - = एन; } जबकि (बाइट्स टू रीड! = 0); –

+0

यह चाल है! मैं एम्बेडेड दुनिया में काफी नया हूं और केवल टेक्स्ट के साथ काम कर रहा था, इसलिए टेक्स्ट आधारित स्ट्रीमरडर का उपयोग नहीं करते समय मैंने बाइट्स की संख्या को मुआवजा दिया। आपको बहुत बहुत धन्यवाद! –

+0

@ मैनुअलआर: आपका स्वागत है! – Baldrick

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