2011-05-09 64 views
2

該場景:如何防止ASP.NET中的瀏覽器超時?

用戶上傳一個小文件或大約100 kB到ASP.NET 4.0應用程序可能有1000個工作單元。 服務器然後開始一次處理一個工作單元。 由於要求來自外部服務的信息,每個單元需要幾秒鐘才能完成。 如果使用事務成功完成所有單元,則結果僅保存到數據庫。 一旦完成,用戶可能會得到完成的清單。

問題是,用戶沒有得到確認,而是他的瀏覽器,我想由於超時而放棄。

未來的文件預計會增加幾百倍,增加了這個問題。

我想防止這種超時。

這裏有一些想法,我有:

  1. 優化代碼的運行速度。這已完成,不再是問題。
  2. 並行運行請求到外部服務。
  3. 稍微增加服務器超時。
  4. 讓用戶上傳文件,然後在文件處理完畢後向他發送一封包含結果的電子郵件。
  5. 以某種方式使頁面刷新並在等待時向用戶顯示一些進度信息,例如5%完成 - 在10分鐘內完成。

我該如何實現這最後一步,顯示進度信息並防止瀏覽器超時?

歡迎提出其他建議。

謝謝,

+0

我幾天前回答了一個類似的問題:http://stackoverflow.com/questions/5871646/add-a-realtime-progress-update-to-a-slow-page-in-asp-net/5871947#評論-6770037 – 2011-05-09 15:28:45

回答

2

你把數據上傳到隊列中的數據庫。然後,您有一個異步進程(示例Windows服務)從您的隊列中提取項目並處理它們。您可以通過每個操作的進度來更新數據庫,並在完成時將該項目從隊列中移除並更新其他表格。

爲了取得進展,用戶可以查詢隊列表以瞭解他的上傳狀態。

0

一個簡單的竅門是編寫一段javacsript來重複請求當前頁面的內容。如果您使用HEAD的請求操作,那麼服務器每次只會響應最少量的信息。

喜歡的東西:

<script src="/js/jquery-1.3.2.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
$(document).ready(function(){ 
setTimeout("callserver()",6000); 
}); 

function callserver() { 
var remoteURL = '/yourpage.aspx'; 
$.get(remoteURL, function(data) { setTimeout("callserver()",6000); }); 
} 
</script> 
4

您需要解耦處理來自瀏覽器的響應文件。這是通過

  • 創建一個永久項目(即在隊列數據庫,文件等),因此它是容錯
  • 返回成功結果到瀏覽器
  • 創建隊列工人異步處理您的隊列。
相關問題