Это дубликат этого вопроса .
Это связано с тем, что ASP.NET 2.0 / 3.5 обрабатывает сеансы в зависимости от того, используется ли он. В обычных обстоятельствах он не пытается сохранить сеанс до тех пор, пока он не будет использован в первый раз, и поэтому не выдает файл cookie сеанса (если он не существует). Первый сеанс используется , на сервере создается сеанс и выдается файл cookie сеанса.
Теперь, когда предыдущий сеанс перезапускается, но не используется, ASP.NET немного запутывается. Он пытается немедленно прекратить неиспользованный (перезапущенный) сеанс, так как он не требуется, что вызывает ранний Session_End. Однако он не удаляет ранее существующий файл cookie сеанса, и, следовательно, каждый последующий запрос повторяет последовательность, перезапускает и затем завершает сеанс до тех пор, пока файл cookie не будет удален или сеанс не будет использован.
В .Net 4.0 это поведение изменилось, и в этом случае событие больше не вызывается.