IP переопределения в запросе HTTP

При поиске способа выпустить HTTPwebrequest или использовать управление браузером или winhttp, чтобы выполнить запрос к URL, но переопределить IP-адрес это соединяется с от поиска DNS до определенного.

Попытка сделать что-то подобное Файлу hosts, но программно не имея необходимость изменять этот файл. Это может быть C# или C +

Почему мне нужен он, хост, я отправляю запрос, имеет несколько дюйм/с, и их Доменные серверы делают выравнивание нагрузки через другого дюйм/с. При попытке вызвать запрос к конкретному IP, но мне нужен хост в запросе HTTP, чтобы быть все еще исходным узлом. Мне нужно это программно, потому что изменение хоста регистрирует каждый раз, когда я должен запустить этот тест, является слишком трудоемким.

5
задан httpresearcher 9 January 2010 в 17:49
поделиться

2 ответа

Если я правильно понимаю, вам нужно сделать HTTP-запрос на веб-сервер с помощью виртуальных хостов, но DNS еще не настроен, поэтому вам нужно указать IP-адрес в URL-адресе, но отправить что-то еще в заголовке Host: .

Если это так, вы можете сделать это ..

В C # с использованием WebProxy:

См. Ответ Кайода Леонарда для .NET 4 и выше.

Вот код, который я бы использовал, если бы мой сервер работал на 67.223.227.171:8888 , но мне нужно иметь www.example.com на хосте : заголовок.

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

См. эту ссылку

В C ++ с использованием WinHttp:

Используя WinHttp, вы можете просто установить заголовок Host: с помощью WinHttpAddRequestHeaders.

Итак, еще раз, если мой сервер работает на 67.223.227.171:8888 , но мне нужно иметь www.example.com на хосте : заголовок:

#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 ++.

6
ответ дан 18 December 2019 в 07:29
поделиться

[ Примечание,далее к ответу Кайода Леонарда : свойство Host было добавлено к запросу в .Net 4.0, что сделало этот ответ устаревшим]

Я думаю , что вы говорите, что хотите иметь возможность переопределить IP-адрес данного хоста без изменения заголовка хоста.

Например, news.bbc.co.uk сопоставляется с IP-адресом 212.58.226.139, но вы хотите иметь возможность сопоставить его с другим IP-адресом, в то время как по-прежнему представляет тот же news.bbc. co.uk HTTP-заголовок "Host" на замещающий адрес. Это то, чего вы добились бы, переопределив файл HOSTS, как вы говорите, что немного отличается от ответа Джейсона, поскольку он не представляет исходный http-заголовок Host.

Я не верю, что это можно легко сделать (хотя я собираюсь поэкспериментировать, чтобы выяснить это!). Конечно, вы не можете сделать следующее:

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

, так как это приведет к ошибке с сообщением, что вы не можете изменить заголовок "Host".

Вы, вероятно, сможете это сделать, если хотите опуститься на уровень ниже HttpWebRequest и работать на более высоком уровне TCP, но я не уверен, как вы подойдете к этому, не опускаясь до этого уровня.

[ Edit ]: поигравшись с различными подходами к переопределению HttpWebRequest и WebHeaderCollection, я почти уверен, что это невозможно сделать таким способом. Однако ответ Александра Жасмина кажется решением.

2
ответ дан 18 December 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: