Почему данные POST теряются при отправке со страницы Custom 404 в IIS 6.0?

Я создал систему Custom 404 CMS в .NET 3.5, и хотя отправка данных работает локально в IIS 5.1 и 6.0, она не работает на производственном сервере IIS 6.0. Я сравнил настройки сайта IIS 6.0 элемент за элементом, и они почти идентичны, с единственной разницей, не имеющей значения.

Я подтвердил, что форма отправляется POST на "http://domain/folder/folder/page.resource "в каждом случае (код находится в SVN) и что при отправке перенаправления не происходит (я создавал исключения, чтобы убедиться). Некоторая отладочная информация по серверу:

IIS 5.1 (my computer, works):
ServerVariables["REQUEST_METHOD"]="POST"
Request.TotalBytes = 1600
Request.QueryString.Count = 1 (NOTE: contains "404;http://domain:80/folder/folder/page.resource" in each case)
Request.Form.Count = 109

IIS 6.0 (test server, works):
ServerVariables["REQUEST_METHOD"]="GET" (NOTE: IIS 6.0 reads this as "GET" instead of "POST")
Request.TotalBytes = 1600
Request.QueryString.Count = 1
Request.Form.Count = 109

IIS 6.0 (production server, does not work):
ServerVariables["REQUEST_METHOD"]="GET"
Request.TotalBytes = 0 (NOTE: should be ~1600)
Request.QueryString.Count = 1
Request.Form.Count = 0 (NOTE: should be 109)

У кого-нибудь есть идеи? Я читал о том, что данные POST не отправляются в IIS 7.0 для страниц 404, но не в 6.0. Моя форма находится в таком формате:

<form id="GolfRegistration" name="GolfRegistration" method="POST" action="/folder/folder/page.resource" onSubmit="return CalculateAmount();">
<input type="button" value="Submit" onClick="if(ValidateInput()){submit(GolfRegistration);}">
</form>

Только для IIS 5.1 я настраиваю расширение .resource в «IIS> Веб-сайт> Свойства> вкладка« Домашний каталог »> Кнопка« Конфигурация »>« Добавить »для работы с GET, HEAD и POST. Это предотвращает появление ошибок 405 при отправке.

Изменить: я изменил POST на GET, и во всех 3 случаях он правильно отправил данные, поэтому это не проблема формы. К сожалению, я не могу передать переменные (их 109) в строку запроса.


person user101567    schedule 05.05.2009    source источник


Ответы (2)


У меня была та же проблема, и, к сожалению, похоже, что ответ - «это особенность».

Подробнее здесь: Хорошо, я попытался опубликовать ссылку на описание проблемы, но там написано, что «новые пользователи не могут размещать ссылки». Поэтому лучшее, что я могу сделать, это сделать следующее: выполнить поиск в Google по запросу «IIS 6: Form Post Data Missing in 404/405 Custom Error Handler» (убедитесь, что они заключены в кавычки), и, по крайней мере, на момент написания этой статьи , верхним результатом должна быть страница, о которой я говорил.

Итак, что происходит:

1) Ваш несуществующий URL-адрес отправляется POST (например, mydomain.com/somepage) 2) IIS получает запрос, отмечает, что somepage не существует, а затем запускает второй запрос к вашему обработчику ошибок и внутренний метод этого запроса - GET. И никакие из ваших данных POST не передаются.

Остается вопрос, почему вы все добились успеха в IIS 6 - это меня сбивает с толку.

В любом случае, прочтите ссылку выше, чтобы узнать больше.

Между прочим, я запускаю PHP на IIS 6 / Windows2003 и обнаружил интересный обходной путь. Хотя PHP не получает переменные POST от IIS (как и следовало ожидать), PHP по-прежнему имеет доступ к необработанному входному потоку, обозначенному «php: // input», который он может читать оригинал тело запроса от. Он будет содержать переменные POST в необработанном формате - я смог использовать функцию PHP parse_str (), чтобы получить переменные POST из этой необработанной строки.

Итак, может быть возможным сделать что-то подобное в ASP.NET. Вы пробовали проверять Request.InputStream? Если мне не изменяет память, это даст вам поток, из которого вы сможете читать. Может быть, у него будут необработанные данные POST?

-Джош

person Community    schedule 22.05.2009

Попробуйте временно изменить метод формы на GET. Это должно сообщить вам, отправляются ли какие-либо данные и какие данные отправляются.

Раньше я сталкивался с подобной проблемой, и в итоге проблема заключалась в том, что скрипт генерировал отправляемый контент, а не когда данные были отправлены.

person Matt    schedule 05.05.2009
comment
Я изменил его на GET, и он отправляет данные в строке запроса во всех трех экземплярах. - person user101567; 05.05.2009