ASP.net:并发文件上传 N 次大型上传后失败



我正在开发一个 asp.net(Webforms,asp.net 2.0,Framework 3.5)应用程序。它是在IIS 7.0上运行的32位应用程序,操作系统Windows 2008 R2 SP1

我遇到了大文件上传的问题。超过 20 MB 左右的文件。该应用程序能够上传大文件,但是,请注意,在 N 次上传后,下一组上传将继续失败,直到重新启动 IIS。

应用程序支持并发文件上传。请注意,单个大文件上传始终有效。只有当我们开始上传超过 1 个文件时,其中一个上传才会卡住。

我尝试查看上传已发布文件数据的临时文件夹,并注意到当问题发生时,失败文件的上传永远不会从服务器的角度开始,因为它永远不会生成任何临时文件,几秒钟后,请求失败。

当事情失败时, 中央处理器一切正常 W3wp 的内存使用量为 2 GB(相对于总共 4 GB RAM) W3wp 没有显示崩溃,因为应用程序的其他页面仍然可以正常工作

我尝试使用wireshark查看网络流量,但它也显示ERR_connection_RESET。除此之外,我没有任何线索。

我怀疑下面的事情,但不确定如何得出结论或修复。 1) 要开始并发上传,服务器需要应对来自客户端的数据抽取速率,当它无法匹配时,它必须在内部失败。这可能是由于服务器无法处理并发请求。 2) 频繁的大上传会增加应用程序的内存占用,以至于它无法与并发上传一起使用,因为要以分块方式将文件转储到临时位置,仍然需要 RAM

这是我的网络配置设置

<httpRuntime maxRequestLength="2097151" executionTimeout="10800" enableVersionHeader="false"/>

从实施角度来看, 1)我们有用Java脚本编写的客户端实现,它创建FormData并将XHR发送到服务器 2)服务器有一个方法,当完整的文件被复制到服务器的临时目录时,它会被调用,我们使用Request.Files集合提取文件数据,然后进一步处理

出现问题时,将调用服务器方法,但 Request.Files 为空。

如果有人对此有很好的见解,请告诉我,这可以指导我找到根本原因并解决问题。

更新: 客户端代码表示形式:

//Set HTTP headers
_http.setRequestHeader("x-uploadmethod", "formdata");
_http.setRequestHeader("x-filename", "Name of file");
// Prepare form data
var data = new FormData();
data.append("Name of file", File contents);
//Sends XHR request
_http.send(data);

服务器端代码表示形式:

HttpFileCollection files = Request.Files;
int Id = objUpload.UploadMyAssets(files[0]);

UploadMyAssets 中的逻辑是将 file[0] 作为 HttpPostedFile,然后继续使用特定于应用程序的逻辑。

谢谢

我遇到了同样的问题。事实证明 ASP.NET 默认会话管理器正在通过https(HTTP/2)阻止异步流。没有通过http(非SSL)发生。 通过使用控制器类的 SessionStateBehavior.Readonly 解决了此问题。 与这篇文章相关: ASP.Net 异步 HTTP 文件上传处理程序

相关内容

最新更新