2

我敢肯定,我已经踏上了许多以前的步骤,但似乎无法解决这个问题。目标是为具有实时进度条(可能用于多个文件)的 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 Forms 插件)提交文件上传帖子。
  • 使用 IFRAME 进行嵌套的各种场景。
  • 当我从第一页提交上传时,有一个单独的页面(在单独的浏览器选项卡中)运行轮询 jQuery。轮询仍然停止并排队,直到第一页完成。

我在网上看到了其他非常相似的解决方案,其他人声称对他们有用,所以它一定是可能的,我只是缺少一些基本的东西。

更新:

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

4

2 回答 2

0

我终于偶然发现了原因:ASP.NET SessionState 锁定。

这个问题在这个 SO 帖子中被优雅地提出和回答:ASP.net session request queueing

与 ASP.NET 文件上传实时进度有关的任何在线材料中都没有提到这方面,并且我在上面最初评论中提到的至少一个解决方案未能EnableSessionState="false"在其上传页面的指令中明确设置 - 可能导致一些对其使用的投诉。(请注意,您也可以设置为 Readonly 以获得读写器锁定的好处)。

简而言之,一旦您为用户实例化任何 Session 对象,该用户的所有未来并发页面请求将默认阻塞,因为 EnableSessionState 默认为 True。老实说,我很惊讶我在职业生涯的早期从未遇到过这个问题。无论如何,我希望它可以帮助别人。作为记录,我确实有实时进度条,现在在 ASP.NET 2.0 中工作得很好,无需使用 Flash 或 HTML5——现在通过应用程序状态跟踪状态。

于 2012-12-18T09:50:34.317 回答
0

我还将对上面引用的 2 个链接做一些非常简短的评论,以帮助其他人避免被这些代码库中的一些严重问题所困扰:

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

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

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

于 2012-12-18T10:03:08.573 回答