c# - त्रुटि "यह धारा सी#में संचालन की तलाश का समर्थन नहीं करती है"




stream byte (5)

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

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

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

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;

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


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

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

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

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


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

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();
}

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

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


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


छवियों के साथ, आपको बाइट्स की संख्या को बिल्कुल भी पढ़ने की आवश्यकता नहीं है। बस यह करें:

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
}

शायद आपको System.Net.WebClient API का उपयोग करना चाहिए। यदि पहले से ही ग्राहक का उपयोग कर रहा है। client.OpenRead(url) ग्राहक का उपयोग करें। डाऊनलोडडाटा (url)

var client = new System.Net.WebClient();
byte[] buffer = client.DownloadData(url);
using (var stream = new MemoryStream(buffer))
{
    ... your code using the stream ...
}

स्पष्ट रूप से यह Stream से पहले सब कुछ डाउनलोड करता है, इसलिए यह Stream का उपयोग करने के उद्देश्य को पराजित कर सकता है। webClient.DownloadData("https://your.url") को एक बाइट सरणी मिलती है जिसे आप बाद में webClient.DownloadData("https://your.url") में बदल सकते हैं।





byte