2010-08-08 14 views
35

में" तलाश ऑपरेशन का समर्थन नहीं करती है "मैं byte स्ट्रीम का उपयोग करके एक यूआरएल से एक छवि प्राप्त करने का प्रयास कर रहा हूं। लेकिन मुझे यह त्रुटि संदेश मिलता है:त्रुटि "यह स्ट्रीम सी #

यह स्ट्रीम तलाश संचालन का समर्थन नहीं करती है।

byte[] b; 
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url); 
WebResponse myResp = myReq.GetResponse(); 

Stream stream = myResp.GetResponseStream(); 
int i; 
using (BinaryReader br = new BinaryReader(stream)) 
{ 
    i = (int)(stream.Length); 
    b = br.ReadBytes(i); // (500000); 
} 
myResp.Close(); 
return b; 

क्या मैं गलत लोगों को कर रहा हूँ:

यह मेरा कोड है?

+0

एक ऐसी ही स्थिति उत्तर दिया गया और मदद मिल सकती है, देखें: http://stackoverflow.com/a/43981770/2791237 –

उत्तर

63

शायद आपको ऐसा कुछ चाहिए। या तो लंबाई की जांच विफल हो जाती है, या बाइनरी रीडर दृश्यों के पीछे खोज कर रहा है।

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url); 
WebResponse myResp = myReq.GetResponse(); 

byte[] b = null; 
using(Stream stream = myResp.GetResponseStream()) 
using(MemoryStream ms = new MemoryStream()) 
{ 
    int count = 0; 
    do 
    { 
    byte[] buf = new byte[1024]; 
    count = stream.Read(buf, 0, 1024); 
    ms.Write(buf, 0, count); 
    } while(stream.CanRead && count > 0); 
    b = ms.ToArray(); 
} 

संपादित करें:

मैं परावर्तक का उपयोग कर जाँच की है, और यह stream.Length करने के लिए कॉल यह काम नहीं करता है। GetResponseStream एक कनेक्टस्ट्रीम देता है, और उस वर्ग की लंबाई संपत्ति आपके द्वारा देखे गए अपवाद को फेंकता है। जैसा कि अन्य पोस्टर का उल्लेख है, आप विश्वसनीय रूप से HTTP प्रतिक्रिया की लंबाई प्राप्त नहीं कर सकते हैं, जिससे यह समझ में आता है।

+0

हाय ngoozeff का उपयोग करें, धन्यवाद, यह चाल है! काम करने लगता है! – Yustme

+5

स्ट्रीम की लंबाई विफल हो जाती है लेकिन प्रतिक्रिया। सामग्री लम्बाई वैध लंबाई लौटाती है। – andleer

+0

इसे इस तरह के बाइट्स में प्राप्त करने की आवश्यकता नहीं है, हालांकि, एक छवि के लिए, यदि आप इसे छवि के रूप में उपयोग करना चाहते हैं। नीचे मेरा जवाब देखें। – vapcguy

0

स्ट्रीम की लंबाई स्ट्रीम से नहीं पढ़ी जा सकती क्योंकि रिसीवर यह नहीं जानता कि प्रेषक कितने बाइट भेजेगा। Http के शीर्ष पर प्रोटोकॉल डालने का प्रयास करें और स्ट्रीम में पहली वस्तु के रूप में लंबाई भेजें।

5

यदि सर्वर HTTP शीर्षलेख में लंबाई विनिर्देश नहीं भेजता है, तो स्ट्रीम आकार अज्ञात है, इसलिए Length संपत्ति का उपयोग करने का प्रयास करते समय आपको त्रुटि मिलती है।

स्ट्रीम के अंत तक पहुंचने तक छोटे हिस्सों में स्ट्रीम पढ़ें।

6

आप इसकी लंबाई के लिए HTTP कनेक्शन से विश्वसनीय रूप से पूछ नहीं सकते हैं। सर्वर को आपको अग्रिम लंबाई भेजने के लिए संभव है, लेकिन (ए) वह हेडर अक्सर गायब होता है और (बी) यह सही होने की गारंटी नहीं है।

इसके बजाय आप चाहिए:

  1. एक निश्चित लंबाई byte[] कि आप Stream.Read विधि को पारित
  2. एक List<byte>
  3. प्रत्येक पढ़ने के बाद बनाएँ, फोन List.AddRange अपने फिक्स्ड की सामग्री को संलग्न करने के लिए लम्बा बफर आपकी बाइट सूची

ध्यान दें किपर अंतिम कॉलआपके द्वारा पूछे जाने वाले बाइट्स की पूर्ण संख्या से कम वापस आ जाएगा। सुनिश्चित करें कि आप केवल List<byte> पर बाइट्स की संख्या संलग्न करें और पूरे byte[] पर नहीं, या आपको अपनी सूची के अंत में कचरा मिल जाएगा।

+0

हाय, मैं अब एक तरह से उलझन में हूँ। मेरा कोड कैसा दिखना चाहिए? – Yustme

+0

@Yustme, 'var buffer = नई सूची (); जबकि (सच) {बाइट [] tmpBuffer = नया बाइट [1024]; int बाइट्स रीड = br.Read (tmpBuffer, 0, tmpbuffer.length); buffer.AddRange (tmpBuffer.Take (bytesRead)); अगर (बाइट्स रीड strager

+0

या स्ट्रीमरडर – Justin

10

उपयोग एक StreamReader बजाय:

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url); 
WebResponse myResp = myReq.GetResponse(); 

StreamReader reader = new StreamReader(myResp.GetResponseStream()); 
return reader.ReadToEnd(); 

(नोट - एक बाइट सरणी ऊपर रिटर्न एक String के बजाय)

+1

(... जिसे एन्कोडिंग कक्षाओं द्वारा प्रदान किए गए कार्यों का उपयोग करके बाइट सरणी में परिवर्तित किया जा सकता है।) – sunside

+0

यह स्वीकार्य उत्तर होना चाहिए, यह दूसरे की तुलना में कहीं अधिक सुविधाजनक है एक! – Couitchy

+0

यदि इसमें स्ट्रीमरडर से बाइट्स या छवि में इसे कैसे प्राप्त किया जाए, तो दिनचर्या या लिंक था। इसके बिना, हम अभी भी एक वर्ग में हैं, मैं कहूंगा। यह मेरी मदद नहीं करता था। – vapcguy

0
छवियों के साथ

, तुम सब पर बाइट की संख्या को पढ़ने के लिए की जरूरत नहीं है ।बस इस कार्य करें:

Image img = null; 
string path = "http://www.example.com/image.jpg"; 
WebRequest request = WebRequest.Create(path); 
req.Credentials = CredentialCache.DefaultCredentials; // in case your URL has Windows auth 
WebResponse resp = req.GetResponse(); 

using(Stream stream = response.GetResponseStream()) 
{ 
    img = Image.FromStream(stream); 
    // then use the image 
} 
संबंधित मुद्दे