jquery - 为什么我无法从文件上传进度栏获取异步行为?

标签 jquery asp.net file-upload

我确信我正在遵循许多人之前的步骤,但似乎无法解决这一问题。目标是为具有实时进度条的 ASP.NET 2.0 站点创建一个文件上传页面(可能用于多个文件)。

我已经实现并测试了该解决方案的大部分部分。但愚蠢的是,我似乎无法让它一起工作。

  1. 构建一个自定义 HttpModule,用于处理相关请求的 PreRequestHandlerExecute 事件(最初使用 BeginRequest,但我想访问 Session),并使用 HttpWorkerRequest 对象分块解析传入的表单发布数据。实时进度保存到 session 中。

  2. 在同一应用程序中构建 Web 服务,该应用程序提供 ScriptMethod,将 JSON 返回到 jQuery 请求,并包含从 session 中提取的进度信息。测试了一下,它有效。

我的问题是,当 (1) 正在进行时,我无法对 (2) 中的 ScriptMethod 进行 jQuery 轮询。 jQuery 调用只是似乎在某个地方排队,一旦上传完全发布,它们都会突然返回“100%”。所以异步部分不起作用。

我尝试过的事情:

  • 使用 .ajaxForm()(jQuery 表单插件)提交文件上传帖子。
  • 使用 IFRAME 嵌套的各种场景。
  • 当我从第一页提交上传时,有一个单独的页面(在单独的浏览器选项卡中)运行轮询 jQuery。民意调查仍然会停止并排队,直到第一页完成。

我在网上看到了其他非常类似的解决方案,其他人声称这些解决方案对他们有效,所以这一定是可能的,而我只是错过了一些基本的东西。

更新:

问题已解决,一切正常。请参阅下面我自己关于 SessionState 锁定的回答。

最佳答案

我还将对上面提到的两个链接发表一些非常简短的评论,以帮助防止其他人被这些代码库中的一些严重问题所困扰:

  • 带进度条的 ASP.NET 文件上传,作者:Sunasara Imdadhusen:这个示例看起来很漂亮,但实际上没什么用,因为它只跟踪文件上传后将文件写入磁盘的进度已经完全完成(通常是大文件的较长部分)。

  • ASP.NET 文件直接发布到磁盘,并由 Travis Whidden 支持上传文件进度:一个更好的起点,因为此代码确实实现了自定义 HttpModule 来实时监控上传。然而,缓冲区处理类FileProcessor.cs有多种bug,应该重写。此外,根据 HTTP 规范从 header 本身提取表单后边界字符串是最安全的。

最后,对于 .NET 4.0 和 MVC 3+ 上的用户来说,由于新的 Request.GetBufferlessInputStream() 方法,等效解决方案要简单得多 - 有关详细信息,请参阅本文:http://vanacosmin.ro/Articles/Read/AjaxFileUpload

关于jquery - 为什么我无法从文件上传进度栏获取异步行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13925118/

相关文章:

c# - 是否可以从代码隐藏中设置一个新的 asp 超链接

javascript - Node.js AJAX 文件 uploader

file-upload - 如何处理基于 s3 浏览器的上传?

javascript - jquery数据表: page length select list not shown

javascript - tinyMCE - 将样式复制到剪贴板以供 word 等使用

javascript - 使用 jQuery 替换 div 内容

c# - 如果同时执行多个插入查询时发生错误,如何回滚表

javascript - 我如何在 jqueryUI 中克隆一个拖动的元素

javascript - Page_ClientValidate 未定义

firefox - 检索使用 Firefox 上传的文件的完整路径(服务器端)?