【问题标题】:Asynchronous file upload response never makes it back to client (or takes longer than it should)异步文件上传响应永远不会返回客户端(或花费的时间比应有的时间长)
【发布时间】:2018-02-20 16:21:56
【问题描述】:

我们的应用程序存在问题,我们从未从一个非常简单的异步文件上传调用中得到响应给客户端(在本例中为 Chrome)。它还会使我们的服务器瘫痪长达 2 分钟。下面是我们的 Controller 方法:

public async Task<HttpResponseMessage> Post(string id, string fileName)
{


    string[] allowedAttachmentFileTypes = ConfigurationManager.AppSettings["AttachmentsSetting"].Split(',');
    string extension = Path.GetExtension(fileName);
    bool extensionAllowed = allowedAttachmentFileTypes.Any(allowedAttachmentFileType => allowedAttachmentFileType.ToLower().Trim() == extension.ToLower().Trim());

    if (extensionAllowed)
    {
        var fileResult = await Request.Content.ReadAsStreamAsync();
        //...do async database stuff with fileResult

        return Request.CreateResponse(HttpStatusCode.OK, result);
    }
    else
    {
        //this never makes it back to client
        var response = new HttpResponseMessage(HttpStatusCode.UnsupportedMediaType)
        {

            Content = new StringContent(ConfigurationManager.AppSettings["AttachmentsSetting"])
        };
        return response;
    }

}

目前我主要关心的是我们正在测试系统中的文件扩展名无效,以便它转到 else 子句并返回错误的响应。当我们在此处设置断点时,它会命中我们的控制器并最终命中我们在 else 子句中的 return,并按预期工作,但在 Chrome 中,它仍然显示“Pending”。

另一件事是它似乎取决于我们发送给控制器的文件的大小,即使我们实际上并没有对文件做任何事情,除非扩展名是有效的。 26,939KB 的无效文件永远不会给我们服务器响应。虽然 17,432KB 给了我们一个,但仍然需要一分钟。

我应该补充的另一件事:这更不一致,但有时如果我们在更大的文件上有一个有效的文件扩展名,比如 26,939KB 的文件,我们会得到“不再有可用的 HttpContext。 "尝试将文件复制到文件系统时

【问题讨论】:

  • 上传前为什么不在客户端检查文件扩展名?
  • 我们现在实际上正在这样做以改善用户体验,但如果他们上传有效文件,仍有可能存在 DDoS。只是将文件发送到控制器的行为似乎会减慢我们的速度。还用我们遇到的另一个错误更新了帖子。
  • 如果您可以假定无效扩展是 UI 绝不允许的错误,您可以使用 this approach 中止请求。

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


【解决方案1】:

这最终成为了防火墙问题。没有任何代码相关。

【讨论】:

    猜你喜欢
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多