Error “Esta secuencia no admite operaciones de búsqueda” en C #

Estoy tratando de obtener una imagen de una url usando una secuencia de byte . Pero recibo este mensaje de error:

Esta secuencia no admite operaciones de búsqueda.

Este es mi código:

 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; 

¿Qué estoy haciendo mal chicos?

Probablemente quieras algo como esto. O bien, la comprobación de la longitud falla, o el BinaryReader está haciendo búsquedas detrás de las escenas.

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

editar:

Lo comprobé usando el reflector, y es la llamada a la transmisión. La duración que falla. GetResponseStream devuelve un ConnectStream y la propiedad Length de esa clase arroja la excepción que vio. Como se menciona en otros carteles, no se puede obtener de manera confiable la longitud de una respuesta HTTP, por lo que tiene sentido.

Use un StreamReader en su lugar:

 HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url); WebResponse myResp = myReq.GetResponse(); StreamReader reader = new StreamReader(myResp.GetResponseStream()); return reader.ReadToEnd(); 

(Nota: lo anterior devuelve una String lugar de una matriz de bytes)

No se puede pedir confiablemente una conexión HTTP para su longitud. Es posible hacer que el servidor le envíe la longitud por adelantado, pero (a) ese encabezado a menudo falta y (b) no está garantizado que sea correcto.

En cambio, deberías:

  1. Cree un byte[] longitud fija byte[] que pase al método Stream.Read
  2. Crear una List
  3. Después de cada lectura, llame a List.AddRange para agregar el contenido de su búfer de longitud fija a su lista de bytes

Tenga en cuenta que la última llamada a Read devolverá menos que el número completo de bytes que solicitó. Asegúrate de agregar solo esa cantidad de bytes a tu List y no a todo el byte[] , o obtendrás basura al final de tu lista.

Si el servidor no envía una especificación de longitud en el encabezado HTTP, el tamaño de la secuencia es desconocido, por lo que se obtiene el error cuando se intenta usar la propiedad Length .

Lea la secuencia en trozos más pequeños, hasta que llegue al final de la secuencia.

La longitud de una secuencia no se puede leer desde la secuencia ya que el receptor no sabe cuántos bytes enviará el remitente. Intenta poner un protocolo en la parte superior de http y envía, es decir, la longitud como primer elemento en la secuencia.

Con las imágenes, no necesita leer el número de bytes. Solo haz esto:

 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 }