1

.NET3.5でカスタム404CMSシステムを構築しました。データの投稿は、IIS 5.1および6.0でローカルに機能しますが、実稼働IIS6.0サーバーでは機能しません。IIS 6.0サイトの設定を項目ごとに比較しましたが、ほとんど同じですが、違いは重要ではありません。

フォームがそれぞれ「 http://domain/folder/folder/page.resource 」にPOSTされていること(コードは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)

誰かアイデアはありますか?404ページのIIS7.0で送信されないPOSTデータについて読みましたが、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の場合のみ、[IIS]>[Webサイト]>[プロパティ]>[ホームディレクトリ]タブ>[構成]ボタン>[追加]で.resource拡張子を設定して、GET、HEAD、およびPOSTを操作します。これにより、送信時に405エラーが発生するのを防ぐことができます。

編集:POSTをGETに変更しましたが、3つのケースすべてでデータが正しく送信されたため、フォームの問題ではありません。残念ながら、クエリ文字列で変数(109個あります)を渡すことができません。

4

2 に答える 2

2

私も同じ問題を抱えていましたが、残念ながら、答えは「これは機能です」のようです。

詳細はこちら: 問題の説明へのリンクを投稿しようとしましたが、「新しいユーザーはリンクを投稿できません」と表示されます。代わりに、私ができる最善の方法は次のとおりです。「IIS 6: Form Post Data Missing in 404/405 Custom Error Handler」(引用符で囲まれていることを確認してください) を Google 検索し、少なくともこれを書いている時点では、一番上の結果は私が参照していたページになるはずです。

要約すると、何が起こっているかは次のとおりです。

1) 存在しない URL が POST されます (例: mydomain.com/somepage) 2) IIS がリクエストを受信し、somepage が存在しないことを認識し、エラー ハンドラに対して 2 番目のリクエストを起動します。そのリクエストのメソッドは、内部的には GET です。また、POST データは一切渡されません。

では、皆さんがなぜIIS 6 で成功しているのかという疑問が残ります

いずれにせよ、詳細については上記のリンクをお読みください。

ちなみに、私は IIS 6/Windows2003 で PHP を実行していて、興味深い回避策を発見しました。PHP は IIS から POST 変数を受け取りませんが (ご想像のとおり)、PHP は "php://input" で識別される未加工の入力ストリームにアクセスでき、そこから元の要求本文を読み取ることができます。これには POST 変数が未加工の形式で含まれます。PHP の parse_str() 関数を使用して、未加工の文字列から POST 変数を取得できました。

したがって、ASP.NET でも同様のことができる可能性があります。Request.InputStream を調べてみましたか? 私の記憶が正しければ、読み取り可能なストリームが得られます。多分それは生のPOSTデータを持っていますか?

-ジョシュ

于 2009-05-22T18:27:27.380 に答える
1

フォームメソッドを一時的にGETに変更してみてください。これにより、データが送信されているかどうか、およびどのデータが送信されているかがわかります。

以前に同様の問題に遭遇したことがありますが、データが送信されたときではなく、送信されるコンテンツを生成するスクリプトに問題がありました。

于 2009-05-05T13:34:19.530 に答える