Отображение значимой ошибки при загрузке слишком большого файла
-
05-07-2019 - |
Вопрос
Мы установили фиксированный лимит на размер файлов для загрузки на нашем сайте - ниже размера по умолчанию для asp.net и настройки iis.
У меня есть простая настройка перехвата в Application_BeginRequest, которая ловит это (это не excat, поскольку он проверяет ContentLength, включая все другие данные формы, но это достаточно хорошо). Я хочу либо возобновить обработку страницы, на которую пытался загрузить пользователь, либо в качестве запасного плана перенаправить пользователя на страницу, объяснив, что размер файла был слишком большим (у нас уже есть подзаголовок, объясняющий это, но вы знаете пользователей - ' им не нужно читать никаких вонючих субтитров ».
Так в чем проблема? Что ж, похоже, что мой Ответ уже был отправлен пользователю - 404, объясняющий, что страница не может быть найдена. Я не хочу такого поведения, я хочу сбросить этот ответ, так как это не тот, который я хочу, чтобы пользователь видел - я хочу показать что-то другое - создать свой собственный ответ, перенаправить или просто обработать страницу, которую он должен был получить в любом случае.
Я думаю, что проблема все еще заключается в том, что IIS отклоняет запрос / публикацию, поскольку файл больше, чем того требует IIS. Я действительно это копаю - сумасшедшему пользователю, пытающемуся загрузить 20-миллиметровую картинку, нельзя позволять делать IIS на коленях, но так ли это? Или я получу шанс перехватить этот ответ для пользователя - вместо того, чтобы увеличить максимальный размер IIS и, следовательно, тратить полосу пропускания на получение этого файла, я просто хочу идентифицировать этот пост как «слишком большой» и посылать соответствующий ответ назад к пользователю.
Решение
У меня была такая же проблема, и после долгих поисков, похоже, не было идеального решения этой проблемы. Вы можете изменить максимальную длину запроса, чтобы установить, в какой момент IIS будет обслуживать ошибку ASP.Net. Вы также можете перехватить эту ошибку на global.asax и показать пользователю более дружелюбную страницу с ошибкой. Р>
Дополнительную информацию об этом можно найти здесь http: //www.developer. ком / дб / article.php / 10920_3426051_2
Другие советы
Отличный ресурс!
Я использовал приведенную выше ссылку для реализации перехвата файлов, загружаемых на сервер, которые были слишком большими и перенаправлялись на страницу ошибок по умолчанию
web.config - >
< customErrors mode="RemoteOnly" defaultRedirect="~/GenericError.htm" />
MyPage.aspx.cs - >
protected void Page_Error(object sender, EventArgs e)
{
if (HttpContext.Current.Error is HttpException)
if ((HttpContext.Current.Error as HttpException).ErrorCode == -2147467259)
{
Server.ClearError();
Response.Redirect(@"~/FileSizeError.htm", false);
}
}
Ответы выше не работали для меня в IIS 7.5. Мы наконец придумали следующее:
void Application_PreSendRequestHeaders(Object sender, EventArgs e)
{
if (
Request.Headers["Content-Length"] != null &&
int.Parse(Request.Headers["Content-Length"]) > 150000000 &&
Request.RawUrl.EndsWith("/Release/ProjectReleases.aspx?Mode=Create"))
{
try
{
Response.Redirect("http://anyurl", true);
}
catch (HttpException ex)
{
if (ex.Message == "Maximum request length exceeded.")
{
Server.ClearError();
Response.ClearHeaders();
Response.Redirect("http://www.edward-williams.com", true);
}
}
}
}
Не нужно было изменять максимальный размер загрузки. Получив окончательную версию, на самом деле установите статическое значение для максимального размера загрузки на основе значения в web.config и перенаправьте на пользовательскую страницу с ошибкой по сравнению с этой домашней страницей, но вы поняли идею.