5

寻找一种发出 HTTPwebrequest 的方法,或使用浏览器控件或 winhttp 向 URL 发出请求,但将其连接到的 IP 地址从 DNS 查找覆盖到特定的 IP 地址。

尝试执行类似于 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:

请参阅Kayode Leonard对 .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,您可以简单地使用 WinHttpAddRequestHeaders 设置Host:标头。

所以再一次,如果我的服务器正在运行,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,但您希望能够将其映射到另一个 IP 地址,同时仍然向被覆盖的地址。正如您所说,这就是您通过覆盖 HOSTS 文件所获得的结果,这与 Jason 的回答略有不同,因为他不会显示原始的“Host”http 标头。

我不相信您可以轻松做到这一点(尽管我将尝试找出答案!)。当然,您不能执行以下操作:

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

因为这将失败,并显示您无法修改“主机”标头的错误。

如果您愿意降低 HttpWebRequest 的级别并以更高的 TCP 级别进行处理,您可能可以这样做,但我不确定如果不降低到该级别,您将如何处理它。

[编辑]:玩过各种覆盖 HttpWebRequest 和 WebHeaderCollection 的方法后,我很确定它不能以这种方式完成。但是,Alexandre Jasmin 的回答似乎是解决方案。

于 2010-01-09T15:11:53.840 回答
0

我正在添加一个依赖于curl命令--resolve行选项的答案。

https://curl.haxx.se/docs/manpage.html#--resolve

在高级语言中,通常可以调用curl.

于 2020-08-31T10:28:50.693 回答