5

HTTPwebrequest を発行する方法、またはブラウザー コントロールを使用する方法、または winhttp を使用して URL への要求を作成する方法を探していますが、接続先の IP アドレスを DNS ルックアップから特定のものにオーバーライドします。

HOSTS ファイルと同様のことをしようとしていますが、このファイルを変更することなくプログラムで実行します。C#またはC+にすることができます

なぜ必要なのか、リクエストを送信しているホストには複数の IP があり、それらのドメイン サーバーはさまざまな IP 間で負荷分散を行っています。要求を特定の IP に強制しようとしていますが、http 要求のホストが元のホストのままである必要があります。このテストを実行する必要があるたびにホスト ファイルを変更するのは時間がかかりすぎるため、プログラムでこれが必要です。

4

4 に答える 4

14

あなたがしなければならなかったのはこれだけでした:

var request = (HttpWebRequest) WebRequest.Create("http://192.168.1.1");
request.Host = "news.bbc.co.uk";
于 2011-12-10T03:29:17.057 に答える
6

私が正しく理解している場合、仮想ホストを使用して Web サーバーに http 要求を行う必要がありますが、DNS はまだ設定されていないため、URL で IP アドレスを指定する必要がありますが、Host:ヘッダーで何か他のものを送信する必要があります。

そういうことなら、できるかも..

C# で WebProxy を使用する場合:

.NET 4以降については、カヨデ・レナードの回答を参照してください。

サーバーを実行しているが、ヘッダー67.223.227.171:8888に含める必要がある場合に使用するコードを次に示します。www.example.comHost:

System.Net.WebRequest r = System.Net.WebRequest.Create("http://www.example.com");
r.Proxy = new WebProxy("http://67.223.227.171:8888");

このリンクを参照してください

WinHttp を使用する C++ の場合:

WinHttp を使用するHost:と、WinHttpAddRequestHeaders でヘッダーを簡単に設定できます。

したがって、サーバーを実行しているが、ヘッダー67.223.227.171:8888に含める必要がある場合は、次のようになります。www.example.comHost:

#include <windows.h>
#include <winhttp.h>
#include <assert.h>

int main() {
  HINTERNET hSession = WinHttpOpen(L"A WinHTTP Example Program/1.0", 
                                    WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                                    WINHTTP_NO_PROXY_NAME, 
                                    WINHTTP_NO_PROXY_BYPASS, 0);

  assert(hSession != NULL);


  // Use WinHttpConnect to specify an HTTP server.
  HINTERNET hConnect = WinHttpConnect( hSession,
                             L"67.223.227.171",
                             8888,
                             0 );

  assert(hConnect != NULL);

  // Open and Send a Request Header.
  HINTERNET  hRequest = WinHttpOpenRequest( hConnect,
                                 L"GET", 
                                 L"/downloads/samples/internet/winhttp/retoptions/redirect.asp", 
                                 NULL,
                                 WINHTTP_NO_REFERER,
                                 WINHTTP_DEFAULT_ACCEPT_TYPES,
                                 0 );

    assert(hRequest != NULL);

   BOOL httpResult = WinHttpAddRequestHeaders(
                                  hRequest,
                                  L"Host: www.example.com",
                                  -1L,
                                  0);

   assert(httpResult);

  httpResult = WinHttpSendRequest( hRequest,
                                   WINHTTP_NO_ADDITIONAL_HEADERS, 
                                   0,
                                   WINHTTP_NO_REQUEST_DATA,
                                   0,
                                   0,
                                   0 );

  assert(httpResult);

  httpResult = WinHttpReceiveResponse( hRequest, NULL );

  assert(httpResult);
}

編集済み:クラス名はWebProxy. C# サンプル コードを追加しました。C++ サンプル コードを追加しました。

于 2010-01-09T15:06:25.177 に答える
2

[ Kayode Leonardの回答に加えて、.Net 4.0のリクエストにHostプロパティが追加されたため、この回答は廃止されました]

ホストヘッダーを変更せずに、特定のホストのIPアドレスを上書きできるようにしたいということだと思います。

たとえば、news.bbc.co.ukはIPアドレス212.58.226.139にマップされますが、同じnews.bbc.co.uk「ホスト」httpヘッダーをに表示しながら、これを別のIPアドレスにマップできるようにする必要があります。オーバーライドされたアドレス。これは、あなたが言うようにHOSTSファイルをオーバーライドすることで達成できることです。これは、元の「Host」httpヘッダーを表示しないため、Jasonの回答とは少し異なります。

私はあなたがこれを簡単に行うことができるとは思いません(私はそれを見つけるために実験しようとしていますが!)。確かに、次のことはできません。

var request = (HttpWebRequest) WebRequest.Create("http://192.168.1.1");
request.Headers["Host"] = "news.bbc.co.uk";

これは、「Host」ヘッダーを変更できないというエラーで失敗するためです。

HttpWebRequestより下のレベルに下がって、より多くのTCPレベルで処理することをいとわない場合は、おそらくそれを行うことができますが、そのレベルに下がらずにどのようにアプローチするかはわかりません。

[編集]:HttpWebRequestとWebHeaderCollectionをオーバーライドするさまざまなアプローチを試してみたので、この方法では実行できないと確信しています。しかし、アレクサンドルジャスミンの答えは解決策のようです。

于 2010-01-09T15:11:53.840 に答える