4

HTTP POST と GET を操作するカスタム Http ハンドラーがあります。プロジェクトを別の隔離されたサーバーで動作させたので、それを本番環境に置く必要があります...

using (var client = new WebClient())
                {
                    client.Credentials = CredentialCache.DefaultCredentials;
                    client.UploadFile("serverlocation:port", fileToUpload);
                }

何らかの理由client.UploadFile("", file);で、HTTP POST を強制的に使用する場合

System.Net.WebException: The remote server returned an error: (417) Expectation failed.

   at System.Net.WebClient.UploadFile(Uri address, String method, String fileName)

これは何ですか?コードが機能することはわかっています。サーバーが HTTP POST 要求をブロックしている可能性がありますか?

私は追加しようとしました:

ServicePointManager.Expect100Continue = false;

しかし、私はこのコードが以前にどこにあるべきか100%確信が持てませんでしたが、成功していません.WebClientを使用する前だと思います


編集 0 :

私はちょうど次のことを読んだ

古い実装が存在するため、プロトコルは、クライアントが 417 (Expectation Failed) ステータスまたは 100 (Continue) ステータスを受信せずに「Expect: 100- continue」を送信する可能性があるあいまいな状況を許可します。したがって、クライアントがこのヘッダー フィールドを、100 (Continue) ステータスを確認したことがないオリジン サーバーに (おそらくプロキシ経由で) 送信する場合、クライアントは、リクエスト ボディを送信する前に無期限に待機するべきではありません (SHOULD NOT)。

このリクエストはプロキシ経由で行われていると思いますが、これが問題に関係している可能性があります。

編集1:

この問題は 100-continue にあると信じてください。なぜなら、fiddler を使用してアプリケーションが何を送信しているかを正確に確認すると、次のようになるからですWebClient.UploadFile

POST http://XXX.XXX.XXX.XXX:8091/file.myhandledextension HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------8ccd1eb03f78bc2
Host: XXX.XXX.XXX.XXX:8091
Content-Length: 4492
Expect: 100-continue

その行を入れたにもかかわらず: ServicePointManager.Expect100Continue = false;using ステートメントの前に。この行は実際には機能しないと思います。

4

1 に答える 1

3

ServicePointManager.Expect100Continue = false;呼び出し元の WebClient クラスのコンストラクターに を入れることで、これを解決しました。

次に、 Fiddlerを使用して POST リクエストを調べ、リクエストにExpect: 100-continue含まれていないことを確認しました。

于 2010-06-04T02:03:26.223 に答える