Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 为什么可以';我不能从文件上传进度条中获取异步行为吗?_Jquery_Asp.net_File Upload - Fatal编程技术网

Jquery 为什么可以';我不能从文件上传进度条中获取异步行为吗?

Jquery 为什么可以';我不能从文件上传进度条中获取异步行为吗?,jquery,asp.net,file-upload,Jquery,Asp.net,File Upload,我相信我已经踏上了许多人的脚步,但似乎无法解决这一问题。目标是为ASP.NET 2.0站点创建一个文件上载页面,该站点具有实时进度条(用于可能的多个文件) 我已经实现并测试了解决方案的大部分部分。但愚蠢的是,我似乎无法让所有这些都一起工作 构建了一个定制的HttpModule,用于处理相关请求的PreRequestHandlerExecute事件(最初使用BeginRequest,但我希望访问会话),并使用HttpWorkerRequest对象分块解析传入表单post数据。实时进度保存到会话中

我相信我已经踏上了许多人的脚步,但似乎无法解决这一问题。目标是为ASP.NET 2.0站点创建一个文件上载页面,该站点具有实时进度条(用于可能的多个文件)

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

  • 构建了一个定制的HttpModule,用于处理相关请求的PreRequestHandlerExecute事件(最初使用BeginRequest,但我希望访问会话),并使用HttpWorkerRequest对象分块解析传入表单post数据。实时进度保存到会话中

  • 在同一应用程序中构建web服务,该应用程序提供ScriptMethod,将JSON返回到jQuery请求,并从会话中提取进度信息。测试了这个,它工作了

  • 我的问题是,(2)中的ScriptMethod的jQuery轮询无法在(1)过程中进行。jQuery调用似乎在某处排队,一旦上传完成,它们都会以“100%”的速度突然返回。所以异步部分不起作用

    我尝试过的事情:

    • 使用.ajaxForm()(jQuery表单插件)提交文件上传帖子
    • 使用iframe进行嵌套的各种场景
    • 让一个单独的页面(在单独的浏览器选项卡中)在我从第一个页面提交上传时运行轮询jQuery。投票仍会停止并排队,直到第一页完成
    我在网上看到了其他非常类似的解决方案,其他人声称这些解决方案对他们有效,所以这肯定是可能的,我只是缺少一些基本的东西

    更新:


    问题已经解决,现在一切正常。请参见下面关于会话状态锁定的我自己的答案。

    我最终偶然发现了原因:ASP.NET会话状态锁定

    这个问题在这篇文章中被优雅地提出和回答:

    与ASP.NET file upload Real Time progress相关的任何在线资料中都没有提到这一方面,我在上面的初始评论中提到的解决方案中至少有一个未能在其上传页面的指令中明确设置
    EnableSessionState=“false”
    ,这可能导致对其使用的一些投诉。(请注意,您还可以设置为只读,以获得读写器锁定的好处)


    简而言之,一旦为用户实例化任何会话对象,默认情况下该用户的所有未来并发页面请求都将被阻止,因为默认情况下EnableSessionState为True。我真的很惊讶我在职业生涯的早期从未遇到过这个问题。无论如何,我希望它能帮助其他人。作为记录,我的实时进度条现在在ASP.NET 2.0中运行良好,无需使用Flash或HTML5,现在正在通过应用程序状态跟踪状态。

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

    • Sunasara Imdadhusen的带有进度条的ASP.NET文件上载:此示例看起来很漂亮,但实际上毫无用处,因为它只跟踪文件上载完成后将文件写入磁盘的进度(对于大型文件,通常是较长的部分)

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


    最后,对于.NET 4.0和MVC 3+上的用户,由于新的请求,等效的解决方案要简单得多。GetBufferlessInputStream()方法有关详细信息,请参阅本文:

    您的网页基于HTML5吗?没有它,就不可能有实时的进展。(以前的网页使用类似Flash的东西)该网页不是基于HTML5的。你确定没有HTML5或Flash就不可能实现实时进度吗?这里有两种解决方案,它们被认为是有效的,并且有很高的评价:有趣的。看起来他们正在使用
    iframe
    作为黑客,允许在后台提交表单。带有文件本身的表单位于单独的
    iframe
    中。还要注意,该文章中的一些评论说“这不是上载进度”——ASP land中的处理程序在文件完全上载后才会运行。因此,我回到我最初的陈述,说你需要一个浏览器插件或HTML5来完成这项工作。你提到的评论让我感到害怕,但谢天谢地,我自己的测试证明它们是不真实的。如果您在自己的HttpModule上处理BeginRequest或PreRequestHandlerExecute,那么您几乎可以立即访问传入的表单post流(您确实需要等待它在所谓的“预加载缓冲区”中的前50KB左右)。但在这之后,您可以在流从客户端接收时实时监视它。