Cách tốt nhất để lấy tệp (trong trường hợp này là .PDF, nhưng bất kỳ tệp nào sẽ làm) từ một WebResponse và đặt nó vào một MemoryStream? Sử dụng .GetResponseStream() từ WebResponse nhận đối tượng Luồng, nhưng nếu bạn muốn chuyển đổi Luồng đó thành một loại luồng cụ thể, bạn sẽ làm gì?Làm cách nào để đặt một WebResponse vào luồng bộ nhớ?
Trả lời
Sao chép trang này từ web một năm trước.
//---------- 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();
}
Tôi tìm thấy sau tại 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()
Đây là một số mã sloppy nghiêm trọng, tôi sẽ không bao giờ sử dụng nó! – emalamisura
Có một vấn đề nghiêm trọng với SoloBold của answer mà tôi khám phá ra trong khi thử nghiệm nó. Khi sử dụng nó để đọc một tập tin thông qua một FtpWebRequest
vào một MemoryStream
nó liên tục không đọc toàn bộ dòng vào bộ nhớ. Tôi theo dõi điều này xuống đến Peek()
đôi khi trở về -1 sau 1460 byte đầu tiên mặc dù Read()
sẽ thành công (tệp lớn hơn đáng kể so với điều này).
Thay vào đó tôi đề xuất các giải pháp dưới đây:
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
Điều này phù hợp với tôi, trong khi các câu trả lời khác không hiệu quả. – Matt
Cảm ơn câu trả lời, Lawrence. Tôi đã nhận được kết quả không nhất quán cố gắng để làm điều này một vài cách khác. – Cashley
Khi bạn nhìn vào IL được tạo ra (thông qua dotPeek) bằng phương thức CopyTo (Stream, Int32) trong .net 4.0, bạn sẽ thấy rằng nó tạo ra mã có cùng mẫu nhưng sử dụng một dòng mã. https://msdn.microsoft.com/en-us/library/system.io.stream.copyto(v=vs.100).aspx. response.CopytTo (memStream, 1024); memStream.Position = 0; –
- 1. Làm thế nào để tải toàn bộ luồng vào MemoryStream?
- 2. Làm thế nào để chuyển đổi một luồng đơn giản (http webresponse) thành bitmapimage trong C# windows 8?
- 3. Vấn đề về luồng bộ nhớ FMod
- 4. Có luồng bộ nhớ nhị phân nào trong C++
- 5. chuyển đổi chuỗi thành luồng bộ nhớ - Luồng bộ nhớ không thể mở rộng?
- 6. Đọc từ luồng bộ nhớ thành chuỗi
- 7. Làm cách nào để đọc/phát tệp mà không tải toàn bộ tệp vào bộ nhớ?
- 8. Làm cách nào để 'làm ấm' bộ nhớ EC2/EBS?
- 9. Làm cách nào để tắt hoàn toàn bộ nhớ cache?
- 10. Làm thế nào để truy cập vào bộ nhớ từ một chương trình trong một
- 11. Làm cách nào để xem bộ nhớ cache trong Android?
- 12. Trả lại luồng bộ nhớ từ hàm
- 13. Dòng C++ vào bộ nhớ
- 14. Có cách nào để lập trình đọc một tệp từ đĩa TrueCrypt vào bộ nhớ không?
- 15. Làm cách nào để giải phóng bộ nhớ do sbrk()?
- 16. Làm cách nào để tắt bộ nhớ đệm trên Firefox?
- 17. Làm cách nào để đặt bộ nhớ jvm tối đa (XMX) cho tệp jar
- 18. Làm cách nào để ngăn trình duyệt lưu vào các trường biểu mẫu bộ nhớ đệm?
- 19. Làm cách nào để cài đặt mô-đun CPAN vào một thư mục cục bộ?
- 20. Serializing/deserializing với luồng bộ nhớ
- 21. Làm cách nào để triển khai bộ nhớ cache hình ảnh trong bộ nhớ trong Android?
- 22. Cách tốt nhất để tải hình ảnh vào bộ nhớ?
- 23. Làm cách nào để xử lý tệp bộ nhớ cache?
- 24. Cách lưu vào bộ nhớ cache xem một đoạn
- 25. Làm thế nào để ngăn chặn Delphi ADO tải toàn bộ bảng vào bộ nhớ?
- 26. Làm cách nào để điền vào một bộ Delphi?
- 27. Không thể truy cập Luồng bộ nhớ đã đóng của luồng, cách mở lại?
- 28. Sự cố bộ nhớ luồng dữ liệu trong C#
- 29. Tập tin đọc Java vào bộ nhớ và cách không làm nổ bộ nhớ
- 30. Làm cách nào để tìm hiểu dung lượng bộ nhớ được cài đặt trong Windows?
này không hiển thị như thế nào để đặt một WebResponse vào một MemoryStream như các poster ban đầu yêu cầu. –