2010-11-22 13 views
6

किसी भी तरह से मैं प्रतिक्रिया स्ट्रीम की लंबाई जान सकता हूं ताकि मैं उपयोगकर्ता को अनिश्चित व्यक्ति के बजाय डाउनलोड की प्रतिशत प्रगति दिखा सकूं?प्रतिक्रिया की लंबाई (HttpWebRequest.GetResponse()। GetResponseStream())

मुझे लगता है कि प्रतिक्रिया नीचे की तरह दिखता है, गैर seekable और कोई लंबाई

उत्तर

13

WebResponse.ContentLength संपत्ति का उपयोग कर प्रयास करें साथ। यदि रिटर्न -1 है, तो इसका मतलब है कि रिमोट सर्वर आपको प्रतिक्रिया निकाय की लंबाई नहीं भेज रहा है, और इसलिए आप पूरी तरह से इसे पढ़ने के बिना प्रतिक्रिया की लंबाई निर्धारित नहीं कर सकते हैं।

+0

मैं PHP जहां में परीक्षण किया है जैसे कि यह प्रयोग करना चाहिए WebStreamWithLenght नाम के एक रैपिंग वर्ग बनाने हल मैंने सामग्री की लंबाई निर्धारित की है ([पेस्टबिन पर कोड] (http://pastebin.com/CX7imFKr)), सुनिश्चित नहीं है कि मैंने सही किया है, और मुझे अभी भी एक अदृश्य धारा मिली है ... हम्म ... मैं कोशिश करूंगा एक वास्तविक डाउनलोड, शायद बाद में download.com से ... –

+2

धारा 'WebResponse.GetResponseStream' गैर-तलाश योग्य है। यह केवल एकमात्र, केवल पढ़ने के लिए स्ट्रीम है। लेकिन 'कंटेंट लम्बाई' हेडर, यदि सेट है, तो आमतौर पर विश्वसनीय है। आपको तलाश नहीं करनी चाहिए। –

1

यदि आप रुचि रखते हैं, तो मेरे पास एक कोड संदर्भ लाइब्रेरी है जिसमें वेबहेल्पर क्लास शामिल है। यह वेब क्लाइंट क्लास (प्रगति की रिपोर्ट करने की क्षमता सहित) के समान है, लेकिन यह अधिक लचीला है। यह कोडप्लेक्स पर संग्रहीत है, परियोजना का नाम BizArk है।

यह प्रतिक्रिया की लंबाई निर्धारित करने के लिए Response.ContentLength गुण का उपयोग करता है।

सामग्री लम्बाई संपत्ति बस सर्वर से शीर्षलेख के हिस्से के रूप में भेजी जाती है। ऐसी स्थितियां हैं जहां सर्वर हेडर भेजने से पहले प्रतिक्रिया की लंबाई नहीं जान सकता है। उदाहरण के लिए, यदि आप सर्वर पर बफरिंग बंद होने के साथ गतिशील रूप से जेनरेट किए गए वेबपृष्ठ को डाउनलोड कर रहे हैं।

-3

मैं (की तलाश है क्योंकि मैं इसे जरूरत नहीं थी विधि लागू नहीं है)

आप इस

WebRequest req = HttpWebRequest.Create(link); 
WebResponse res = req.GetResponse(); 
var stream = res.GetResponseStream(); 
var streamWithLenght = new WebStreamWithLenght(stream, res.ContentLength); 

    public class WebStreamWithLenght : Stream 
    { 
     long _Lenght; 
     Stream _Stream; 
     long _Position; 

     public WebStreamWithLenght(Stream stream, long lenght) 
     { 
      _Stream = stream; 
      _Lenght = lenght; 
     } 

     public override bool CanRead 
     { 
      get { return _Stream.CanRead; } 
     } 

     public override bool CanSeek 
     { 
      get { return true; } 
     } 

     public override bool CanWrite 
     { 
      get { return _Stream.CanWrite; } 
     } 

     public override void Flush() 
     { 
      _Stream.Flush(); 
     } 

     public override long Length 
     { 
      get { return _Lenght; } 
     } 

     public override long Position { get; set; } 

     public override int Read(byte[] buffer, int offset, int count) 
     { 
      var result = _Stream.Read(buffer, offset, count); 
      Position += count; 
      return result; 
     } 

     public override long Seek(long offset, SeekOrigin origin) 
     { 
      throw new NotImplementedException(); 
     } 

     public override void SetLength(long value) 
     { 
      _Lenght = value; 
     } 

     public override void Write(byte[] buffer, int offset, int count) 
     { 
      Write(buffer, offset, count); 
     } 
    } 
+0

डाउनवॉट्स क्यों? क्या कोई यह बताना चाहता है कि यह एक अच्छा जवाब क्यों नहीं है? – setholopolus

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