2013-07-19 33 views
1

我遇到一個問題,我的客戶端應用程序從我們的web服務下載一個大的二進制文件。請注意,這在運行較高操作系統的其他機器上不會發生,並且對於大多數較小的文件大小不會發生。無論出於何種原因,該應用程序在第一個While循環內失敗,到目前爲止還沒有任何幫助。Winforms下載XP上的大文件套接字錯誤

代碼:

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

7/19/2013 10:15:02 AM | 2594b | 0%

7/19/2013 10:15:02 AM |嘗試從Step_Row_ID下載報告時出錯:4533:無法從傳輸連接讀取數據:無法執行套接字上的操作,因爲系統缺少足夠的緩衝區空間或隊列已滿。 | System.Net.Sockets.SocketException:無法執行套接字上的操作,因爲系統缺少足夠的緩衝區空間,或者因爲隊列已滿而在System.Net.Sockets.Socket.Receive(Byte []緩衝區,Int32偏移量爲 , INT32大小,的SocketFlags的SocketFlags) 在System.Net.Sockets.NetworkStream.Read(字節[]緩衝液,INT32偏移,INT32大小)

編輯: 作爲一個更新,此代碼爲這樣的文件大小沒有問題:

7/19/2013 1:23:32 PM | Step_Row_ID 4540下載完成:| 29257728b閱讀

但是,在上面列出的大文件大小下,每次嘗試下載時,都會在不同的字節量之後失敗(請參閱下面的日誌,並查看上面的日誌,不同的字節數,但同樣的故障...) :

7/19/2013 1:23:38 PM | Step_Row_ID下載文件大小:134246639b

7/19/2013 1:23:38 PM | 3770b | 0%

7/19/2013 1:23:38 PM | 12814b | 0%

7/19/2013 1:23:38 PM | 25954b | 0%

7/19/2013 1:23:38 PM | 28658b | 0%

7/19/2013 1:23:38 PM |嘗試從Step_Row_ID下載報告時出錯:4533:無法從傳輸連接讀取數據:無法執行套接字上的操作,因爲系統缺少足夠的緩衝區空間或隊列已滿。 | System.Net.Sockets.SocketException:無法執行套接字上的操作,因爲系統缺少足夠的緩衝區空間,或者因爲隊列已滿而在System.Net.Sockets.Socket.Receive(Byte []緩衝區,Int32偏移量爲 , Int32大小,SocketFlags socketFlags) 在System.Net.Sockets.NetworkStream。讀取(字節[]緩衝區,Int32偏移量,Int32大小)

+0

你能解決嗎? – gsubiran

回答

0

我的歉意,從來沒有意識到這一直沒有得到答覆。

圍繞着稍微不同的方向,選擇使用WebClient.getfile過程。

自從我們將其推向生產以來,實際上已經有一段時間了,所以我不記得確切的代碼集,但實質上我們已經取消了字節讀取的需要。

我會關閉這個問題。