У меня есть приложение Windows / Apache2 / PHP, которое получает файл с использованием кодирования фрагментов. Причина в том, что загруженный файл является динамическим, и его длина до передачи неизвестна. Это всегда отлично работало из коробки.
Теперь мне нужно перенести приложение на IIS7 / PHP. Проблема в том, что IIS не может получить файл с фрагментами: когда файл загружается, сервер просто не отвечает. Как мне решить эту проблему?
Обратите внимание, что в моем тесте я даже не использую PHP. У меня просто расширение .php, потому что IIS отклоняет POST в файле .htm (что имеет смысл).
Как предложил Рупелло в этом ответе , я провел тест с помощью cURL, чтобы убедиться, что мой клиент не сломан. cURL также не может получить ответ, хотя все работает нормально, если передача не разбита на фрагменты.
Я провел следующие тесты:
test.php:
Эта команда не возвращает (застряла в ожидании ответа)
curl.exe http://serveur/test.php --form "upfile=@text.txt"
-H "Transfer-Encoding: chunked" -H "Expect:"
Примечание: -H «Ожидайте:»
для подавить Expect 100-Continue
, выданное curl. Результат тот же без этого заголовка, за исключением, конечно, дополнительной обработки.
Отправлено:
POST http://serveur/test.php HTTP/1.1
User-Agent: curl/7.15.3 (i586-pc-mingw32msvc) libcurl/7.15.3 zlib/1.2.2
Host: serveur
Pragma: no-cache
Accept: */*
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: multipart/form-data; boundary=----------------------------310dbcc6761b
8c
------------------------------310dbcc6761b
Content-Disposition: form-data; name="upfile"; filename="text.txt"
Content-Type: text/plain
5
hello
30
------------------------------310dbcc6761b--
0
Проблема: Сервер ничего не возвращает. Сервер выглядит так, будто ждет. завиток не возвращается.
Та же команда без кодирования фрагментов работает, как ожидалось:
Отправлено:
POST http://serveur/test.php HTTP/1.1
User-Agent: curl/7.15.3 (i586-pc-mingw32msvc) libcurl/7.15.3 zlib/1.2.2
Host: serveur
Pragma: no-cache
Accept: */*
Connection: Keep-Alive
Content-Length: 193
Content-Type: multipart/form-data; boundary=----------------------------e2d761bc173a
------------------------------e2d761bc173a
Content-Disposition: form-data; name="upfile"; filename="text.txt"
Content-Type: text/plain
hello
------------------------------e2d761bc173a--
Сервер теперь отвечает правильно:
HTTP/1.1 200 OK
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-Powered-By: PHP/5.3.8
X-Powered-By: ASP.NET
Date: Mon, 21 Nov 2011 10:47:57 GMT
Content-Length: 272
Тест на обычном сервере LAMP с теми же файлами и запросами работает нормально.
Итак, как мне включить кодирование фрагментов запроса в IIS?
Примечание: я пробовал связанный параметр ASP, но безрезультатно:
C:\...\inetsrv>appcmd.exe set config /section:asp /enableChunkedEncoding:True
Applied configuration changes to section "system.webServer/asp" for "MACHINE/
WEBROOT/APPHOST" at configuration commit path "MACHINE/WEBROOT/APPHOST"