2011-09-11 15 views
13

मैं अन्य वेबसाइट से एचटीएमएल पेज डाउनलोड करने के लिए एक प्रोग्राम लिख रहा हूं। मुझे एक समस्या मिली है कि किसी विशेष वेबसाइट के लिए, मुझे पूरा HTML कोड नहीं मिल सकता है। और मैं केवल आंशिक सामग्री प्राप्त कर सकता हूं। इस समस्या वाला सर्वर "ट्रांसफर-एन्कोडिंग: खंडित" में डेटा भेज रहा है मुझे डर है कि यह समस्या का कारण है।रिटर्न सामग्री एन्कोडिंग होने पर HttpWebResponse से पूरी सामग्री कैसे प्राप्त करें: खंडित?

इस सर्वर द्वारा लौटाए हेडर सूचना:

Transfer-Encoding: chunked 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Content-Type: text/html; charset=UTF-8 
Date: Sun, 11 Sep 2011 09:46:23 GMT 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Server: nginx/1.0.6 

यहाँ मेरी कोड है:

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
HttpWebResponse response; 
CookieContainer cookie = new CookieContainer(); 
request.CookieContainer = cookie; 
request.AllowAutoRedirect = true; 
request.KeepAlive = true; 
request.UserAgent = 
    @"Mozilla/5.0 (Windows NT 6.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2 FirePHP/0.6"; 
request.Accept = @"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
string html = string.Empty; 
response = request.GetResponse() as HttpWebResponse; 

using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    html = reader.ReadToEnd(); 
} 

मैं केवल आंशिक एचटीएमएल कोड (मुझे लगता है कि यह पहली बार हिस्सा है मिल सर्वर से)। क्या कोई मदद कर सकता है? कोई भी समाधान?

धन्यवाद!

+0

HttpWebResponse पहले से ही जानता है कि कैसे खंडित डेटा से निपटने के लिए। जिसे आप अनदेखा नहीं कर सकते हैं वह ContentEncoding है। आप अपने StreamReader कन्स्ट्रक्टर कॉल में utf8 मानते हैं, यह गलत होने पर यह गलत हो जाएगा। –

+0

हाय हंस पासेंट, आपकी टिप्पणियों के लिए धन्यवाद। मैं पुष्टि करता हूं कि वेब पेज यूटीएफ 8 एन्कोडिंग के साथ है। मैं StreamReader में एन्कोडिंग सेटिंग को ASCII में बदलने की कोशिश करता हूं, फिर भी वही परिणाम, यदि यूनिकोड में बदल जाता है, तो सभी सामग्री अपठनीय कोड हैं। – syking

+0

@ हंसपैसेंट मुझे स्पष्ट रूप से एक ही समस्या है लेकिन StreamReader कन्स्ट्रक्टर में एन्कोडिंग पास करने में मदद नहीं मिलती है। मैंने रेस्पॉन्सस्ट्रीम को मेमोरीस्ट्रीम में कॉपी करने और सभी संभावित एन्कोडिंग के लिए स्ट्रीम रीडर बनाने की भी कोशिश की और उनमें से कोई भी सभी हिस्सों को पूरी तरह से डंप करने में सक्षम नहीं था। कोई उपाय? –

उत्तर

-1

अगर मैं समझ लिया है कि आप क्या लाइन

string htmlLine = reader.ReadLine(); 
9

द्वारा लाइन पढ़ने क्या कर सकते हैं पूछ रहे हैं आप ReadToEnd उपयोग नहीं कर सकते chunked डेटा को पढ़ने के लिए। GetBytes का उपयोग करके आपको प्रतिक्रिया स्ट्रीम से सीधे पढ़ने की आवश्यकता है।

StringBuilder sb = new StringBuilder(); 
Byte[] buf = new byte[8192]; 
Stream resStream = response.GetResponseStream(); 

do 
{ 
     count = resStream.Read(buf, 0, buf.Length); 
     if(count != 0) 
     { 
          sb.Append(Encoding.UTF8.GetString(buf,0,count)); // just hardcoding UTF8 here 
     } 
}while (count > 0); 
String html = sb.ToString(); 
+0

यह उत्तर काम कर रहा है लेकिन इसमें कोड गुम है। 'गिनती' नामक चर परिभाषित नहीं किया गया है। यदि आप लूप में 'count--' जोड़ने से buf.Length के साथ चर और सेट मान को परिभाषित करते हैं, तो यह काम करेगा। – bafsar

+0

@ बाफसर इसे प्रतिक्रिया का उपयोग करके बेहतर किया जाना चाहिए। सामग्री के आधार पर बाइट [] buf = new बाइट [प्रतिक्रिया। सामग्री लम्बाई]; सही बफर लंबाई प्राप्त करने के लिए – Redeemed1

+0

@ रिडीम 1 1 ट्रांसफर-एन्कोडिंग के साथ सामग्री लम्बाई सेट नहीं है: – GeorgeChond

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