एक अन्य प्रश्न में, 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 सीधे पहुंचने पर डेटा खोने क्यों है? मैं सिर्फ यह काम नहीं करना चाहता, लेकिन मैं समझना चाहता हूं कि संस्करण विफल क्यों होता है और संस्करण बी सफल होता है जबकि दोनों डेटा के उसी स्रोत (प्रतिक्रिया.गेट्रॉस्पॉन्सस्ट्रीम()) पर निर्भर करते हैं। इस मामले में हुड के तहत क्या हो रहा है?
आपके प्रयासों के लिए धन्यवाद!
int बाइट्स रीड = 0; int बाइट्स टॉरेड = बफर। लम्बाई; { int n = s.Read (बफर, बाइट्स रीड, बाइट्स टू रीड); बाइट्स रीड + = एन; बाइट्स टॉरेड - = एन; } जबकि (बाइट्स टू रीड! = 0); –
यह चाल है! मैं एम्बेडेड दुनिया में काफी नया हूं और केवल टेक्स्ट के साथ काम कर रहा था, इसलिए टेक्स्ट आधारित स्ट्रीमरडर का उपयोग नहीं करते समय मैंने बाइट्स की संख्या को मुआवजा दिया। आपको बहुत बहुत धन्यवाद! –
@ मैनुअलआर: आपका स्वागत है! – Baldrick