我的客户端应用程序从我们的网络服务下载大型二进制文件时遇到问题。请注意,这不会发生在运行更高操作系统的任何其他机器上,并且不会发生在大多数较小的文件大小上。无论出于何种原因,该应用程序在第一个 While 循环内失败,到目前为止,谷歌搜索也没有任何帮助。
编码:
Try
Dim strWebRequestUrl As String = (url ommited)
Dim fileSize As Int64 = Nothing
Dim reqDownload As HttpWebRequest = HttpWebRequest.Create(strWebRequestUrl)
Dim resDownload As HttpWebResponse = reqDownload.GetResponse
Dim streamDownload As Stream = Nothing
Dim bytesToRead As Int64 = Nothing
Dim totalBytes As Int64 = Nothing
Dim bytesRead As Int64 = Nothing
Dim saveLocation As String = Nothing
Dim saveExt As String = resDownload.GetResponseHeader("EXTENSION")
Dim fstr As FileStream = Nothing
Dim downloadPercent As String = "0%"
fileSize = resDownload.ContentLength
'This is just logging stuff:
StrDebugStatus = "Step_Row_ID downloaded file size: " & fileSize
LogDebug(StrDebugStatus)
streamDownload = resDownload.GetResponseStream
Dim inBuf(fileSize) As Byte
bytesToRead = CInt(inBuf.Length)
totalBytes = CInt(inBuf.Length)
bytesRead = 0
While bytesToRead > 0
Dim n As Int64 = streamDownload.Read(inBuf, bytesRead, bytesToRead)
If n = 0 Then
Exit While
End If
bytesRead += n
bytesToRead -= n
downloadPercent = FormatPercent(bytesRead / totalBytes, 0)
StrAppStatus = bytesRead & "b" & " | " & downloadPercent
LogMe(StrAppStatus)
End While
然后它继续写入文件。写入文件不是问题,它在通过 While 语句的第一个循环中出错......同样,这只发生在大于大约 100mb 的文件上,并且只发生在 XP 机器上......任何帮助将不胜感激。
这是发生时保存到我的日志文件中的错误的输出:
2013 年 7 月 19 日上午 10:15:02 | Step_Row_ID 下载文件大小:134246639
2013 年 7 月 19 日上午 10:15:02 | 2594b | 0%
2013 年 7 月 19 日上午 10:15:02 | 尝试从 Step_Row_ID 下载报告时出错:4533:无法从传输连接读取数据:由于系统缺少足够的缓冲区空间或队列已满,因此无法对套接字执行操作。| System.Net.Sockets.SocketException:无法对套接字执行操作,因为系统缺少足够的缓冲区空间或 System.Net.Sockets.Socket.Receive(Byte[] 缓冲区中的队列已满,Int32 偏移量,Int32大小,SocketFlags socketFlags) 在 System.Net.Sockets.NetworkStream.Read(Byte[] 缓冲区,Int32 偏移量,Int32 大小)
编辑: 作为更新,此代码适用于这样的文件大小,没有问题:
2013 年 7 月 19 日下午 1:23:32 | Step_Row_ID 4540 下载完成:| 29257728b 读取
但是对于上面列出的大文件大小,每次尝试下载时,它都会在不同的字节数后失败(请参阅下面的日志,并查看上面的日志,不同的字节数但同样的失败......):
2013 年 7 月 19 日下午 1:23:38 | Step_Row_ID 下载文件大小:134246639b
2013 年 7 月 19 日下午 1:23:38 | 3770b | 0%
2013 年 7 月 19 日下午 1:23:38 | 12814b | 0%
2013 年 7 月 19 日下午 1:23:38 | 25954b | 0%
2013 年 7 月 19 日下午 1:23:38 | 28658b | 0%
2013 年 7 月 19 日下午 1:23:38 | 尝试从 Step_Row_ID 下载报告时出错:4533:无法从传输连接读取数据:由于系统缺少足够的缓冲区空间或队列已满,因此无法对套接字执行操作。| System.Net.Sockets.SocketException:无法对套接字执行操作,因为系统缺少足够的缓冲区空间或 System.Net.Sockets.Socket.Receive(Byte[] 缓冲区中的队列已满,Int32 偏移量,Int32大小,SocketFlags socketFlags) 在 System.Net.Sockets.NetworkStream.Read(Byte[] 缓冲区,Int32 偏移量,Int32 大小)