Переопределить IP в HTTP-запросе - PullRequest
5 голосов
/ 09 января 2010

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

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

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

Ответы [ 3 ]

13 голосов
/ 10 декабря 2011

Все, что вам нужно было сделать, это:

var request = (HttpWebRequest) WebRequest.Create("http://192.168.1.1");
request.Host = "news.bbc.co.uk";
6 голосов
/ 09 января 2010

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

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

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

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

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

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 в заголовке Host::

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

2 голосов
/ 09 января 2010

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

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

Например, news.bbc.co.uk сопоставляется с IP-адресом 212.58.226.139, но вы хотите иметь возможность сопоставить его с другим IP-адресом, в то время как все еще представляет тот же файл news.bbc. co.uk "Хост" http заголовок к переопределенному адресу. Это то, чего вы добьетесь, переопределив файл 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, я почти уверен, что это невозможно сделать таким образом. Однако ответ Александра Жасмина, кажется, является решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...