1

我的客户端应用程序从我们的网络服务下载大型二进制文件时遇到问题。请注意,这不会发生在运行更高操作系统的任何其他机器上,并且不会发生在大多数较小的文件大小上。无论出于何种原因,该应用程序在第一个 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 大小)

4

1 回答 1

0

我的道歉,从来没有意识到这没有得到答复。

最终走向一个稍微不同的方向,并选择使用 WebClient.getfile 过程。

实际上,自从我们将其投入生产以来已经有一段时间了,所以我不记得确切的代码集,但本质上我们消除了对字节读取的需求。

我将关闭这个问题。

于 2014-03-12T21:26:15.987 回答