【发布时间】: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