vb.net - metodo - vb net get
¿Cómo pongo una WebResponse en una secuencia de memoria? (3)
¿Cuál es la mejor manera de obtener un archivo (en este caso, un archivo .PDF, pero cualquier archivo lo hará) desde un WebResponse y ponerlo en un MemoryStream? El uso de .GetResponseStream () de WebResponse obtiene un objeto Stream, pero si desea convertir esa transmisión a un tipo específico de transmisión, ¿qué hace?
Encontré lo siguiente en http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/eeeefd81-8800-41b2-be63-71acdaddce0e/
Dim request As WebRequest
Dim response As WebResponse = Nothing
Dim s As Stream = Nothing
Dim fs As FileStream = Nothing
Dim file As MemoryStream = Nothing
Dim uri As New Uri(String.Format("http://forums.microsoft.com/forums/ShowPost.aspx?PostID=2992978&SiteID=1"))
request = WebRequest.Create(uri)
request.Timeout = 10000
response = request.GetResponse
s = response.GetResponseStream
''2 - Receive file as memorystream
Dim read(256) As Byte
Dim count As Int32 = s.Read(read, 0, read.Length)
File = New MemoryStream
Do While (count > 0)
File.Write(read, 0, count)
count = s.Read(read, 0, read.Length)
Loop
File.Position = 0
''Close responsestream
s.Close()
response.Close()
''3 - Save file
fs = New FileStream("c:/test.html", FileMode.CreateNew)
count = file.Read(read, 0, read.Length)
Do While (count > 0)
fs.Write(read, 0, count)
count = file.Read(read, 0, read.Length)
Loop
fs.Close()
File.Close()
Copié esto de la web hace un año o más.
//---------- Start HttpResponse
if(objHttpWebResponse.StatusCode == HttpStatusCode.OK)
{
//Get response stream
objResponseStream = objHttpWebResponse.GetResponseStream();
//Load response stream into XMLReader
objXMLReader = new XmlTextReader(objResponseStream);
//Declare XMLDocument
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(objXMLReader);
//Set XMLResponse object returned from XMLReader
XMLResponse = xmldoc;
//Close XMLReader
objXMLReader.Close();
}
//Close HttpWebResponse
objHttpWebResponse.Close();
}
Hay un problema serio con la respuesta de SoloBold que descubrí mientras lo probaba. Al usarlo para leer un archivo a través de una FtpWebRequest
en un MemoryStream
, no pudo leer intermitentemente todo el flujo en la memoria. Seguí esto hasta Peek()
veces devolvía -1 después de los primeros 1460 bytes aunque una Read()
hubiera tenido éxito (el archivo era significativamente más grande que este).
En su lugar, propongo la solución a continuación:
MemoryStream memStream;
using (Stream response = request.GetResponseStream()) {
memStream = new MemoryStream();
byte[] buffer = new byte[1024];
int byteCount;
do {
byteCount = stream.Read(buffer, 0, buffer.Length);
memStream.Write(buffer, 0, byteCount);
} while (byteCount > 0);
}
// If you''re going to be reading from the stream afterwords you''re going to want to seek back to the beginning.
memStream.Seek(0, SeekOrigin.Begin);
// Use memStream as required