我正在开发一个asp.net(Webforms,asp.net 2.0,Framework 3.5)应用程序。它是在IIS 7.0上运行的32位应用程序,具有OS 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中的逻辑将文件[0]作为HttpPostedFile,然后继续使用特定于应用程序的逻辑。
由于
答案 0 :(得分:0)
我有同样的问题。事实证明,ASP.NET默认会话管理器正在通过https(HTTP / 2)上的异步流进行阻止。没有通过http(non-ssl)发生。 通过对Controller类使用SessionStateBehavior.Readonly解决了此问题。与此帖子相关: ASP.Net Asynchronous HTTP File Upload Handler