我的客户端应用程序从我们的Web服务下载大型二进制文件时出现问题。请注意,在运行较高操作系统的任何其他计算机上都不会发生这种情况,大多数较小的文件大小都不会发生这种情况。无论出于何种原因,应用程序在第一个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机器上...任何帮助都将非常感激。< / p>
以下是出现错误时保存到我的日志文件的输出:
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大小)
答案 0 :(得分:0)
我道歉,从未意识到这一点没有得到答复。
向前略有不同的方向并选择使用WebClient.getfile进程。
实际上已经有一段时间了,因为我们把它推到了生产中,所以我不记得确切的代码集,但实际上我们删除了字节读取的需要。
我将结束这个问题。