チャンクエンコーディングを使用してファイルを受信するWindows/Apache2/PHPアプリがあります。その理由は、アップロードされたファイルが動的であり、転送前にその長さがわからないためです。これは、箱から出してすぐに正常に機能します。
次に、アプリをIIS7/PHPに移植する必要があります。問題は、IISがチャンク化されたファイルの受信に失敗することです。ファイルがアップロードされると、サーバーはまったく応答しません。どうすればこれを解決できますか?
私のテストでは、PHPも使用していないことに注意してください。IISが.htmファイルへのPOSTを拒否するため、私は単に.php拡張子を持っています(これは理にかなっています)。
この回答でrupelloが示唆しているように、クライアントが壊れていないことを確認するためにcURLを使用してテストを行いました。転送がチャンク化されていない場合はすべて正常に機能しますが、cURLも回答を取得できません。
私は次のテストを行いました:
test.php:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
</head>
<body>
<form method="post" enctype="multipart/form-data">
File: <input type="file" name="upfile" />
<input type="submit" value="go"/>
</form>
</body>
</html>
このコマンドは戻りません(応答を待ってスタックします)
curl.exe http://serveur/test.php --form "upfile=@text.txt"
-H "Transfer-Encoding: chunked" -H "Expect:"
注:curlによる発行-H "Expect:"
を抑制します。Expect 100-Continue
結果は、このヘッダーがなくても同じです。もちろん、追加のラウンドトリップを実行します。送信済:
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
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
</head>
<body>
<form method="post" enctype="multipart/form-data">
File: <input type="file" name="upfile" />
<input type="submit" value="go"/>
</form>
</body>
</html>
同じファイルとリクエストを使用したプレーンバニラ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"