XMLHttpRequest ::ERR_CONNECTION_RESET 上传大型(2 个月及更多)文件时

Posted

技术标签:

【中文标题】XMLHttpRequest ::ERR_CONNECTION_RESET 上传大型(2 个月及更多)文件时【英文标题】:XMLHttpRequest ::ERR_CONNECTION_RESET while uploading large (2 Mo & More) files 【发布时间】:2015-02-10 06:18:40 【问题描述】:

问题

我正在尝试使用 XMLHttpRequest 上传文件,但它似乎只适用于小文件(例如小于 2MO 的大小)。到目前为止,我尝试了很多东西,并得出了帖子末尾显示的代码。但是,没有什么可做的;我不断收到::ERR_CONNECTION_RESET 错误。这不是代码问题,因为 2MO 文件正在正确卸载...我忘记了什么?我知道这可能是 IIS 或 web.config 问题,但我可以通过谷歌搜索来解决这个问题。

Chrome 给出的错误

POST WEBSITEANDSERVICEURL/Service/MyService.asmx/UploadFilesWithAJAX net::ERR_CONNECTION_RESET

handleFileSelect x.event.dispatch v.handle

javascript

<script type="text/javascript">
    $(function() 
        $('#<%= files.ClientID %>').change(handleFileSelect);
    );

    function handleFileSelect(e) 
        if (!e.target.files || !window.FileReader) return;

        var fd = new FormData();
        var file = document.getElementById("<%= files.ClientID %>");
        for (var i = 0; i < file.files.length; i++) 
            fd.append('_file', file.files[i]);
        
        var xhr = new XMLHttpRequest();
        xhr.open('POST', '<%= ResolveURL("~/Services/MyService.asmx/UploadFilesWithAJAX") %>', true);
        xhr.onreadystatechange = function() 
            if (xhr.readyState == 4 && xhr.status == 200) 
                alert(xhr.responseText);
            
        ;
        xhr.upload.addEventListener("progress", updateProgress, false);
        xhr.send(fd);
    

    function updateProgress(oEvent) 
        if (oEvent.lengthComputable) 
            var percentComplete = oEvent.loaded / oEvent.total;
            $("#progress").text(oEvent.loaded + " ON " + oEvent.total);
        
    
</script>

html 标记

<asp:FileUpload ID="files" runat="server" multiple="true" />
<br />
<table id="selectedFiles">
</table>
<span id="progress"></span>

MyService.asmx

<ScriptService()> _
<ToolboxItem(False)> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
Public Class AJAXServices : Inherits WebService
    <WebMethod(EnableSession:=True)> _
    <ScriptMethod(ResponseFormat:=ResponseFormat.Xml)> _
    Public Function UploadFilesWithAJAX()
        ' Some code which work fine, I'm sure of it.
    End Function
End Class

Web.config

<!-- [...] -->
<system.web>
    <httpRuntime maxRequestLength="2097151" executionTimeout="180" /><!-- MAXIMUM DURING TESTING -->
    <!-- [...] -->
</system.web>
<!-- [...] -->

【问题讨论】:

【参考方案1】:

在您的网络配置中,您定义了大约 2mb 的 maxRequestLength="2097151",因此如果您尝试上传超过 2mb 的文件,最终会失败。

下面的示例配置(最多允许 2gb)

<httpRuntime maxRequestLength="2048576000" executionTimeout="300" />

【讨论】:

实际上在使用它时,给出的错误是“La valeur de la propriété 'maxRequestLength' n'est pas valide. L'erreur est : La valeur doit être contains dans la plage 0-2097151。”抱歉,它是法文,但这意味着我的值只能从 0 到 2097151。 我明白了,这意味着您的应用程序池在 32 位模式下运行,在这种情况下 maxRequestLength 值由 KB 测量,因此 2097151 是您提到的最大值。你可以忽略我对你的情况的回答,我建议你在这里查看类似的主题***.com/questions/4548305/…【参考方案2】:

好的,我解决了...

解决方案

如果其他人发生这种情况,请务必在您的 WebService 中至少访问一次Context.Request.Files

因为,在我的测试中,我只是:

Public Function UploadFilesWithAJAX()
    Return "RETURN SOMETHING"
End Function

但这还不够……如果我只访问 Context.Request.Files 之类的:

 Public Function UploadFilesWithAJAX()
    Dim files = Context.Request.Files '<---- Simply adding this... make it works :|
    Return "RETURN SOMETHING"
End Function

它有效。 希望它可以帮助别人。

顺便说一句,如果有人可以解释为什么这样做会起作用。

【讨论】:

是的,它实际上也解决了我的问题,所有请求都需要读取 request.files 。

以上是关于XMLHttpRequest ::ERR_CONNECTION_RESET 上传大型(2 个月及更多)文件时的主要内容,如果未能解决你的问题,请参考以下文章

XMLHttpRequest 封装

XMLHttpRequest 对象

XMLHttpRequest 对象

AJAX - 创建 XMLHttpRequest 对象

XMLHTTPRequest 错误:不推荐使用主线程上的同步 XMLHttpRequest ...(SoundCloud API)

XMLHttpRequest 对象