2012-12-18 25 views
2

我確定我在踩許多步驟之前,但似乎無法解決這個問題。目標是爲具有實時進度欄(適用於多個文件)的ASP.NET 2.0網站創建文件上載頁面。爲什麼我無法從我的文件上傳進度欄獲取異步行爲?

我已經實施並測試瞭解決方案的大部分部分。但愚蠢的是,我似乎無法完成所有工作。

  1. 建立了處理的PreRequestHandlerExecute事件自定義HTTP模塊(最初使用的BeginRequest - 但我想訪問會話)的有關要求和使用的HttpWorkerRequest對象分析以塊的形式傳入後的數據。實時進度保存到會話。

  2. 在同一個應用程序中構建Web服務,該應用程序提供ScriptMethod將JSON返回給jQuery請求,並從Session中提取進度信息。測試了這一點,它的工作原理。

我的問題我一直沒能有ScriptMethod的(2),而(1)在過程中出現jQuery的投票。 jQuery調用似乎在某個地方排隊,只要上傳完全發佈,它們都會以「100%」突然返回。所以異步部分不起作用。

事情我已經嘗試:

  • 提交的文件上傳後與.ajaxForm()(jQuery的形式插件)。
  • 使用IFRAMEs嵌套的各種場景。
  • 有一個單獨的頁面(在單獨的瀏覽器選項卡中)運行輪詢jQuery,同時我從第一頁提交我的上傳。民意調查仍然停止並排隊,直到第一頁完成。

我已經在網上看到其他非常類似的解決方案,一些人聲稱爲他們工作,所以它必須是可能的,我只是缺少一些基本的東西。

UPDATE:

問題已經解決,所有正在工作。有關SessionState鎖定,請參閱我自己的回答。

+1

是您的網絡頁面基於HTML5?沒有它,實時進度是不可能的。 (以前的網頁使用Flash這樣的東西) –

+0

網頁不是基於HTML5的。沒有HTML5或Flash,你確定實時進度是不可能的嗎?這裏有兩個解決方案,據稱工作,並有非常高的評價:http://www.codeproject.com/Articles/113418/ASP-NET-File-Upload-with-Progress-Bar和http://www.codeproject.com /文章/ 14832/ASP-NET-file-post-direct-to-disk-with-upload-file –

+0

有趣。看起來他們使用'iframe'作爲黑客,允許在後臺提交表單。文件本身的格式是在單獨的'iframe'中。 –

回答

0

我終於偶然發現了原因:ASP.NET SessionState鎖定。

的問題提出典雅,並回答這個SO職位:ASP.net session request queuing

這方面沒有任何網上的材料有關ASP.NET文件上傳實時進度提到和我提到的解決方案中的至少一個在上面的初步評論中沒有明確地設置EnableSessionState="false"在他們的上傳頁面的指令—可能導致對其使用的一些投訴。 (請注意,您也可以將Readonly設置爲讀寫器鎖定優勢)。

總之,一旦您爲用戶實例化任何會話對象,該用戶的所有未來併發頁面請求都將默認阻止,因爲默認情況下EnableSessionState爲True。我真的很驚訝我在職業生涯早期從未遇到過這個問題。無論如何,我希望它能幫助別人。並且爲了記錄,我確實有實時進度條,現在可以在ASP.NET 2.0中正常工作,無需使用Flash或HTML5 —狀態現在正通過應用程序狀態進行跟蹤。

0

我也將在2個鏈接我引用了一些非常簡單的上述評論,以幫助保持其他人在這些代碼庫的一些嚴重的問題被攔路搶劫:

  • ASP.NET文件上傳與進度條由Sunasara Imdadhusen:這個例子看起來很漂亮,但實際上是無用的,因爲它只跟蹤將文件寫入磁盤的進度之後文件上傳已經完全完成(通常是大文件的較長部分)。

  • ASP.NET文件直接上傳到磁盤,上傳Travis Whidden的文件進度支持:一個好得多的起點,因爲這段代碼實現了自定義HttpModule來實時監控上傳。但是,緩衝區處理類FileProcessor.cs有各種錯誤,應該重寫。另外從每個HTTP規範的頭部自身提取表單後邊界字符串是最安全的。

最後,對於那些在.NET 4.0和MVC 3+,等效的解決方案是簡單得多,由於新Request.GetBufferlessInputStream()方法—看到這篇文章的詳細信息:http://vanacosmin.ro/Articles/Read/AjaxFileUpload

相關問題