При поиске способа выпустить HTTPwebrequest или использовать управление браузером или winhttp, чтобы выполнить запрос к URL, но переопределить IP-адрес это соединяется с от поиска DNS до определенного.
Попытка сделать что-то подобное Файлу hosts, но программно не имея необходимость изменять этот файл. Это может быть C# или C +
Почему мне нужен он, хост, я отправляю запрос, имеет несколько дюйм/с, и их Доменные серверы делают выравнивание нагрузки через другого дюйм/с. При попытке вызвать запрос к конкретному IP, но мне нужен хост в запросе HTTP, чтобы быть все еще исходным узлом. Мне нужно это программно, потому что изменение хоста регистрирует каждый раз, когда я должен запустить этот тест, является слишком трудоемким.
Если я правильно понимаю, вам нужно сделать 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 ++.
[ Примечание,далее к ответу Кайода Леонарда : свойство 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, я почти уверен, что это невозможно сделать таким способом. Однако ответ Александра Жасмина кажется решением.