【问题标题】:Uploading file to Web API timeouts on the server将文件上传到服务器上的 Web API 超时
【发布时间】:2015-10-02 23:56:08
【问题描述】:

我整天都遇到这个问题,我很困惑为什么会这样。

我在 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 请求):

接受:/ 接受编码:gzip,放气 接受语言:en-US,en;q=0.8,da;q=0.6 连接:保持活动 内容长度:3799243 内容类型:multipart/form-data;边界=----WebKitFormBoundaryBVYYdSXRza1yRuW4

以及请求的负载:

------WebKitFormBoundaryBVYYdSXRza1yRuW4 内容处置:表单数据;名称=“文件”;文件名="bruger_caas.xls" 内容类型: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 取消了请求。

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

任何意见将不胜感激。

【问题讨论】:

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


【解决方案1】:

对于那些在谷歌上搜索... 我还在对文件上传超时进行故障排除。 就我而言,我在使用 MultipartMemoryStreamProvider 和 ReadAsMultipartAsync 时遇到了死锁线程

最后这篇其他帖子为我提供了解决方案:

Request.Content.ReadAsMultipartAsync never returns

它使用“TaskCreationOptions.LongRunning”来确保不同的线程并防止死锁。该问题的 cmets 有一个有用的解释。

【讨论】:

    猜你喜欢
    • 2017-12-09
    • 2014-04-04
    • 1970-01-01
    • 2012-05-07
    • 2017-07-28
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2016-12-31
    相关资源
    最近更新 更多