1

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)

4

1 に答える 1

0

申し訳ありませんが、これが未回答であることに気づきませんでした。

少し違う方向に進み、WebClient.getfile プロセスを使用することにしました。

これを本番環境にプッシュしてから実際にはしばらく経っているため、正確なコードセットを思い出せませんが、本質的にはバイト読み取りの必要性を取り除きました.

この質問は締め切らせていただきます。

于 2014-03-12T21:26:15.987 に答える