2010-10-09 38 views
1

假定你有幾行代碼的ASP.NET頁面:IIS 7.0大文件傳輸:「無法從傳輸連接讀取數據:連接已關閉。」

while (true) 
{ 
    byte[BUFFER_SIZE] buffer; 
    // Fill buffer with pseudo data 
    Response.OutputStream.Write(buffer, 0, buffer.Length); 
    Response.Flush(); 
} 

你也有一個測試應用程序與這些代碼行上述頁面:

while (readBytes != 0) 
{ 
    byte[BUFFER_SIZE] buffer; 
    readBytes = stream.Read(buffer, 0, buffer.length) 
} 

而不是閱讀真正的巨大文件,我試圖隨時產生隨機二進制數據並轉移到客戶端,它工作正常。然後,我寫了一個客戶端,他只是從ASP.NET頁面讀取字節,然後不做任何事情,只是讀取下一個字節,直到ASP.NET頁面關閉連接(下載完成)。我在ASP.NET頁面中使用了基於時間的設置來完成下載(這是一個壓力測試)。

因此,IIS 7.0和ASP.NET正在做的是流數據一段時間(即一小時)。我在此頁面上啓動了100個併發客戶端,平均下載速度爲250 KB /秒,時間爲一小時。一切正常約45分鐘,但突然IIS關閉客戶端上的此錯誤代碼的所有連接:

無法從傳輸連接讀取數據:連接已關閉。

我想這是關於通過IIS傳輸大量的二進制數據,應該有一些IIS 7.0中的配置,這是由我的壓力測試觸發的,但是哪種配置。

+0

您是否檢查過服務器上的事件日誌? – 2010-10-09 22:18:16

+0

是的,它只記錄請求的細節,僅此而已。 IIS日誌記錄可能需要一些配置? – Xaqron 2010-10-09 22:21:55

回答

1

答案很有趣,但讓我們回顧一下爲什麼問這個問題以及我如何找到答案。

我遇到問題後,我搜索了網頁,發現類似的問題從來沒有答案。根據我的經驗,當你問一個沒有其他人問過的問題,或者有很多類似的問題沒有機會得到答案的時候,這個問題是有問題的,但是那一刻我沒有想到它。 斷開連接後,我改變了壓力測試參數,發現客戶在測試結束時斷開連接(因爲我告訴測試是基於時間設計的)。在我的代碼中某處,我做了一件錯誤的事情,在某個地方關閉了請求。 儘管到處都在.NET中,你應該關閉連接,釋放資源並調用dispose就在這裏對象在ASP.NET你不應該調用此方法都:

Response.Close() 

後,您在ASP.NET完成頁面,你應該讓IIS完成剩下的工作(讓執行路徑離開你的代碼)。我相信這是錯的。也許它不應該在asp.net頁面範圍內公開,或者方法名稱應該類似於Response.Disconnect(),因爲它與清理代碼非常相似。

是的,我與Response.Close()

踢自己被斷開的客戶端刪除代碼後,一切都正常,但在機器可用RAM是不夠的,我得到這個錯誤,是值得歡迎的,因爲你可以通過添加一些RAM克服這個:

An existing connection was forcibly closed by the remote host. 
相關問題