Web サービスから大きなバイナリ ファイルをダウンロードするクライアント アプリに問題があります。これは、上位の OS を実行している他のマシンでは発生しないことに注意してください。また、ほとんどの小さなファイル サイズでは発生しません。なんらかの理由で、アプリは最初の 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 ステートメントの最初のループ内でエラーが発生します...繰り返しますが、これは約 100 MB を超えるファイルでのみ発生し、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[] buffer, Int32 offset, Int32) でキューがいっぱいだったため、ソケットに対する操作を実行できませんでしたSystem.Net.Sockets.NetworkStream.Read(Byte[] バッファー、Int32 オフセット、Int32 サイズ) でのサイズ、SocketFlags socketFlags)
編集: 更新として、このコードは次のようなファイルサイズで問題なく機能します:
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[] buffer, Int32 offset, Int32) でキューがいっぱいだったため、ソケットに対する操作を実行できませんでしたSystem.Net.Sockets.NetworkStream.Read(Byte[] バッファー、Int32 オフセット、Int32 サイズ) でのサイズ、SocketFlags socketFlags)