У меня есть теория, но я не уверен, как это доказать.Я сделал что-то похожее на cbcolin и записал время, когда запрос начинается из обработчика событий BeginRequest
.Затем, когда время ожидания запроса истекло (в нашем случае через 1 час), оно регистрируется в базе данных и записывается метка времени.
Итак, вот теория: ASP.NET считает только время, которое фактически выполняет поток, а не время, когда он спит.
Таким образом, после BeginRequest
поток переходит в спящий режим, пока IIS не получит все тело POST.Затем нить просыпается, чтобы сделать работу, и часы executionTimeout
начинают работать.Поэтому время, проведенное в фазе передачи по сети, не учитывается в executionTimeout
.В конце концов, истекает время ожидания подключения по всему сайту, и IIS закрывает соединение, что приводит к исключению в ASP.NET.
BeginRequest
и даже PreRequestHandlerExecute
все вызываются перед телом POSTпередается на веб-сервер.Затем проходит длинный промежуток, прежде чем вызывается обработчик запроса.Так что может показаться, что у .NET был запрос в течение 30 минут, но поток не работал так долго.
Я собираюсь начать регистрировать время, когда обработчик запроса фактически запускается, и посмотреть, будет ли он когда-либовыходит за предел, который я установил.
Теперь о том, как контролировать, как долго запрос может оставаться в фазе передачи, как это, для каждого URL, я понятия не имею.На глобальном уровне мы можем установить minBytesPerSecond в webLimits для приложения.Там нет пользовательского интерфейса для него, что я могу найти.Это должно пнуть очень медленных клиентов в фазе передачи.
Это все еще не решит проблему для атак DoS, которые фактически отправляют данные.