我正在建立一些代碼,通過FtpWebRequest
下載圖片。當我收集對DownloadFile
流的響應時,我能夠將內存中的圖像返回到調用函數的唯一方法是使用MyResponseStream.CopyTo(MyMemoryStream)
,然後使用Return MyMemoryStream
。這有效,但我不明白爲什麼我需要在內存中創建一個圖像的兩個副本(可能會非常大)。當我試圖直接返回MyResponseStream
時,代碼只是掛在空間的某個地方,我不得不停止調試器。爲什麼我必須將FTP流複製到另一個變量才能將其返回給調用方法?
爲什麼我不能這樣做?:Return MyResponseStream
在下面的代碼中?
Imports System.IO
Imports System.Net
Public Function GetJpgImage(ByVal ImageID As Integer)
'returns image file from server in a memoryStream
'code from: http://www.dreamincode.net/forums/topic/77912-ftp-download-delete/
'build requested file string
Dim MyRequestedFile As String
MyRequestedFile = ImageID.ToString & ".jpg"
'create FTP request
Dim ftpRequest As FtpWebRequest = DirectCast(WebRequest.Create("ftp://mysite.com/www/downloads/" & MyRequestedFile), FtpWebRequest)
ftpRequest.Credentials = New NetworkCredential("mySpecialUser", "superSecretPwd")
ftpRequest.UseBinary = True
ftpRequest.KeepAlive = False 'No Zombies
'check if file exists (sigh... do it later)
'select download method
ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile
'setup for response
Dim MyMemoryStream As New MemoryStream
Dim FTPResponse As FtpWebResponse = DirectCast(ftpRequest.GetResponse, FtpWebResponse)
'send request and return memoryStream
Using MyResponseStream As IO.Stream = FTPResponse.GetResponseStream
'copy to memory stream so we can close the FTP connection
MyResponseStream.CopyTo(MyMemoryStream) '<== Why God? Why?
'close FTP stream
MyResponseStream.Close()
'gimme my data!
Return MyMemoryStream
End Using
End Function
它沒有任何與MyResponseStream
在Using
聲明(我試過)之中。 VS 2012,Win8。
其實我有它宣稱的方式最初,它似乎並沒有把這個差異題。最後我會再補充一遍。可以肯定的是,我在函數declare中使用'作爲MemoryStream'和'IO.Stream'進行測試。當我嘗試返回'MyResponseStream'時仍然掛起。 – turbonate
更新了我的答案。只是試圖幫助,因爲它真的很奇怪 –
欣賞的想法,讓我在這裏添加一些澄清。在發佈的問題中的代碼作品,但我想弄清楚爲什麼在世界上我不得不使用'CopyTo()'方法來返回流。我嘗試使用DIM語句而不是使用結構,仍然有相同的結果,所以我不認爲'使用'方法是問題。雖然我沒有直接嘗試這個想法,但我已經有效地測試了這個變體,它的工作原理與將它保留在內部一樣。並且基於同樣的想法,我無法將'MyResponseStream'返回到using塊之外,因爲它已經被處理掉了。 – turbonate