Рассмотрим следующий случай:
- На веб-сервере запущено приложение .NET с
<sessionState cookieless="AutoDetect" />
.
- Клиент размещает на нем данные с помощью простого
HttpWebRequest
(без файлов cookie).
Этот, казалось бы, простой случай вызывает серьезный сбой.
Поскольку .NET не может определить, поддерживает ли запрашивающий агент (HttpWebRequest
) файлы cookie, он отвечает на запрос POST перенаправлением 302 Found в то же местоположение с помощью:
- печенье с именем
AspxAutoDetectCookie
в ответе
- параметр запроса с именем
AspxAutoDetectCookie
в переданном местоположении
Затем запрашивающий агент должен запросить новое местоположение, что делает HttpWebRequest
. Когда .NET видит AspxAutoDetectCookie
в строке запроса, он знает, что это повторный запрос, и он может определить, поддерживаются ли файлы cookie, путем проверки наличия в заголовке запроса файла cookie с именем AspxAutoDetectCookie
.
Проблема в том, что большинство запрашивающих агентов (веб-браузеры, HttpWebRequest
) обрабатывают 302 Found, как будто это 303 See Other, и делают повторный запрос GET, независимо от исходного метода HTTP! Любые данные, отправленные в первоначальном запросе POST, не пересылаются.
Правильный ответ должен быть 307 Временное перенаправление, которое не меняет метод запроса. (POST-запрос к расположению X перенаправляет на POST запрос к расположению Y.)
Есть ли способ изменить это поведение в .NET, чтобы POST-запросы не уничтожались?
Информация о перенаправлении 3xx