将文件上载到服务器上的Web API超时

时间:2015-07-14 11:15:21

标签: c# asp.net file-upload asp.net-web-api

我整天都遇到过这个问题,而且我为什么会这么做而迷失了。

我在React JS组件中从客户端发布文件(.xls文件),以响应点击这样的按钮:

upload: function (e) {
    e.preventDefault();
    var model = this.state.model;
    var xlsFile = this.refs.xlsFile.getDOMNode();
    var file = xlsFile.files[0];
    var fd = new FormData();
    fd.append('file', file);
    var request = {
        groupId: this.state.vkNumber,
        payload: fd
    };
    model.importRequest = request;
    model.setImportProcessing();
    MultiOrderActions.updateUsers(request);

    this.setState(model.toState());
}

Chrome中显示的请求(POST请求):

接受: / Accept-Encoding:gzip,deflate 接受语言:EN-US,EN; Q = 0.8,哒; Q = 0.6 连接:保持活跃 内容长度:3799243 内容类型:多部分/格式的数据;边界= ---- WebKitFormBoundaryBVYYdSXRza1yRuW4

请求的有效负载:

------ WebKitFormBoundaryBVYYdSXRza1yRuW4 内容处理:表格数据;命名="文件&#34 ;;文件名=" bruger_caas.xls" Content-Type:application / vnd.ms-excel

------ WebKitFormBoundaryBVYYdSXRza1yRuW4 -

请求中是否有任何二进制数据?内容长度是正确的,内容类型和文件名也是正确的。

在WebAPI中,我正在执行以下操作,ReadAsMultiPartAsync永远不会返回:

[HttpPost]
    [Route("bc/s/{*url}")]
    public async Task<IHttpActionResult> Post(string url)
    {
        var service = CreateClient<GenericService>();
        if (Request.Content.IsMimeMultipartContent())
        {
            try
            {
                var provider = new MultipartMemoryStreamProvider();
                await Request.Content.ReadAsMultipartAsync(provider);

                foreach (var content in provider.Contents)
                {
                    //Do stuff
                    ;
                }

            }
            catch (Exception e)
            {
                ;
            }
        }

        return InternalServerError();
    }

当它到达await关键字时,它就会死掉,并在2分钟后超时,因为Chrome取消了请求。

我在这里做错了什么?我真的不确定问题是文件是否真的从客户端发送过,或者是否是我服务器端代码的问题。

非常感谢任何意见。

1 个答案:

答案 0 :(得分:0)

对于那些谷歌搜索... 我还在排除文件上传的超时故障。 在我的例子中,当使用MultipartMemoryStreamProvider和ReadAsMultipartAsync

时,我得到一个死锁的线程

最后这篇文章为我提供了一个解决方案:

Request.Content.ReadAsMultipartAsync never returns

使用&#34; TaskCreationOptions.LongRunning&#34;确保一个独特的线程,防止死锁。该问题的评论有一个有用的解释。