Мы хотели бы ограничить максимальный размер загружаемого файла на нашем веб-сайте. Мы уже установили соответствующие ограничения в нашем web.config. Проблема, с которой мы сталкиваемся, заключается в том, что если загружен действительно большой файл (например, 1 ГБ), весь файл загружается до возникновения сбоя на стороне сервера, а тип ошибки отличается от того, является ли файл огромным или нет.
Есть ли способ определить размер ожидающей загрузки файла до фактической загрузки?
Здесь мои соответствующие настройки web.config, которые ограничивают запросы до 16 МБ:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<httpRuntime maxRequestLength="12288"/>
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="12582912"/>
</requestFiltering>
</security>
</system.webServer>
</configuration>
Я попытался создать HTTP-модуль, чтобы я мог перехватить запрос на раннем этапе жизненного цикла запроса, но загрузка, похоже, происходит еще до события BeginRequest
HttpApplication
:
public class UploadModule : IHttpModule
{
private const int MaxUploadSize = 12582912;
public void Init(HttpApplication context)
{
context.BeginRequest += handleBeginRequest;
}
public void Dispose()
{
}
private void handleBeginRequest(object sender, EventArgs e)
{
// The upload takes place before this method gets called.
var app = sender as HttpApplication;
if (app.Request.Files.OfType<HttpPostedFile>()
.Any(f => f.ContentLength > MaxUploadSize))
{
app.Response.StatusCode = 413;
app.Response.StatusDescription = "Request Entity Too Large";
app.Response.End();
app.CompleteRequest();
}
}
}
Update:
Я знаю, что технологии на стороне клиента, такие как Flash, могут определять размер файлов перед загрузкой, но нам нужно обходное решение на стороне сервера, потому что мы хотим настроить таргетинг на платформы, у которых нет поддержки Flash/Java/ActiveX/Silverlight. Я считаю, что IIS или ASP.NET имеют ошибку, которая позволяет загружать большие файлы, несмотря на ограничения, поэтому я подал ошибку здесь.
Будет ли расширение ISAPI больше контролировать обработку запросов, чем HTTP-модули и обработчики, например, разрешить мне прервать загрузку, если заголовок Content-Length будет больше допустимого предела?
Обновление 2:
Вздох. Microsoft закрыла ошибку, которую я подала в виде дубликата, но не предоставила никакой дополнительной информации. Надеюсь, они не просто бросили мяч на это.
Обновление 3:
Ура! Согласно Microsoft:
Эта ошибка решается, поскольку она перенесена в группу продуктов IIS. С тех пор команда IIS исправила ошибку, которая будет включена в будущую версию Windows.