2008-10-07 12 views
9

Was ist der beste Weg, um eine Datei (in diesem Fall eine PDF, aber jede Datei wird tun) von einer WebResponse und in einen MemoryStream? Die Verwendung von .GetResponseStream() von WebResponse ruft ein Stream-Objekt ab, aber wenn Sie diesen Stream in einen bestimmten Stream-Typ konvertieren möchten, was tun Sie?Wie lege ich eine WebResponse in einen Speicherstream?

Antwort

0

Kopiert dies aus dem Web vor einem Jahr oder so.

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

dies nicht zeigen, wie ein WebResponse in einen Memorystream als das ursprüngliche Plakat setzen gefragt. –

-3

fand ich folgende bei 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() 
+2

Das ist ein ernsthaft schlampiger Code, den würde ich nie benutzen! – emalamisura

25

Es ist ein ernstes Problem mit SoloBold des answer, die ich während es Testen entdeckt. Wenn es verwendet wurde, um eine Datei über eine FtpWebRequest in eine MemoryStream zu lesen, konnte es zeitweilig nicht den gesamten Strom in den Speicher lesen. Ich verfolgt dies bis Peek() manchmal -1 nach den ersten 1460 Bytes zurückgegeben, obwohl eine Read() wäre erfolgreich gewesen (die Datei war deutlich größer als diese).

Stattdessen schlage ich vor, die Lösung unter:

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 
+0

Das funktioniert für mich, während die anderen Antworten nicht funktionierten. – Matt

+1

Danke für die Antwort, Lawrence. Ich bekam widersprüchliche Ergebnisse, wenn ich versuchte, dies auf andere Weise zu tun. – Cashley

+1

Wenn Sie sich die von der Methode CopyTo (Stream, Int32) in .NET 4.0 generierte IL (via dotPeek) ansehen, werden Sie feststellen, dass sie Code mit demselben Muster erzeugt, aber eine einzige Codezeile verwendet. https://msdn.microsoft.com/en-us/library/system.io.stream.copyto(v=vs.100).aspx. Antwort.CopytTo (memStream, 1024); memStream.Position = 0; –

Verwandte Themen