1. ホーム
  2. c#

HttpWebRequestクラスが送信する生のHTTPリクエストを見るにはどうすればよいですか?

2023-11-03 05:25:50

質問

皆さんは、「Fiddler のようなデバッグ用プロキシサーバーを使用する」と答えられると思いますが、そんなに簡単なことではありません。

私の状況は次のとおりです。ASP.NET ページのコードビハインド (aspx.cs) で、サーバー上で実行されるコードがあり、(他のものの中で) 別の サーバーへの接続を確立し、いくつかのものを取得し、そしてそれをフォーマットしてブラウザに返します。

問題は、他のサーバーが間違ったことを行っていることです。そこで、ページにデバッグフラグを渡すことができるようにしたいのです (クエリ文字列を介して、たとえば ?debug=true) 。 完全に生の HTTP リクエストを出力し、何が問題なのかを知ることができます。 このコードはいくつかの場所で実行されているので、開発、ステージング、または運用でこのフラグを渡すだけで、運用サーバーがどこかに存在するプロキシ サーバーと対話できるかどうかなどを把握することなく、リクエストを確認できるようにしたいのです。

これを行うのは簡単だと思うでしょう? そこで、私がおかしいか何かだと思いますが、HttpWebRequest とその親クラス WebRequest のリファレンスを調べてみましたが、--何もありませんでした。 何もできません。 Microsoftがこれを考えたと思うでしょう。 最も近いのは "Headers" コレクションにアクセスできることですが、私がそれを試したとき、それは "content length" のような本当に重要なヘッダーをいくつか省略しました -- だからそれは私に "lie" しているに違いありません (私はそれが嘘をついていることを知っています。なぜならリモートサーバーが 200 状態を返しているという事実がわかっているので、リクエストが成功しているのですが、悪い/異なる/間違ったデータを返しているだけなのです) 。

以下は、要求されたコードの例です。

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.whatever.com");
req.Method = ... whatever ...;
... other setup for the request ...
/* At this point we are about to send the request.
   What does the raw HTTP request look like? */
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

どのように解決するのですか?

System.Net のトレース機構を使用して、ワイヤ上で送信された生の HTTP リクエストを確認することができます。また、あなた自身の tracelistener をプロセスに追加することもできます。