【发布时间】:2017-08-21 13:25:03
【问题描述】:
我正在开发一个 asp.net(Webforms、asp.net 2.0、Framework 3.5)应用程序。它是在 IIS 7.0 上运行的 32 位应用程序,操作系统为 Windows 2008 R2 SP1
我遇到了上传大文件的问题。大于 20 MB 左右的文件。该应用程序可以上传大文件,但是注意到在 N 次上传后,下一组上传一直失败,直到 IIS 重新启动。
应用程序支持并发文件上传。值得注意的是,单个大文件上传始终有效。只有当我们开始上传超过 1 个文件时,其中一个上传才会卡住。
我尝试查看上传已发布文件数据的临时文件夹,并注意到当问题发生时,失败文件的上传永远不会从服务器的角度开始,因为它永远不会生成任何临时文件,几秒钟后,请求失败。
当事情失败时, CPU一切正常 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 中的逻辑是将 files[0] 作为 HttpPostedFile,然后继续执行特定于应用程序的逻辑。
谢谢
【问题讨论】:
-
你能展示你的代码完成和处理上传
-
添加了代码表示
-
我会尽快看看,看看我能找到什么
-
这些代码块所在的苍蝇类型是什么,以便我可以尝试重现问题
-
另外,我认为这也是一个 WebForms 项目是否正确?
标签: c# asp.net file-upload concurrency