Здравствуйте, intr21, Вы писали:
I>Может, кто знает, как заставить работать такой клиент через
I>авторизующую проксю?
Если кому интересно, то решение проблемы я нашёл.
Возможно, не самое верное и изящное, но однако оно работает.
У меня есть класс-обёртка CMyClass, унаследованный от
CSoapSocketClientT.
Этот класс генерирует визард при добавлении Web Reference.
Меняю предка на
CSoapWininetClient.
Добавляю метод CMyClass::SwitchProxy()
Весь код далее приведён для этого метода.
Сначала устанавливаю адрес:порт прокси сервера, используя нулевой хендл.
Тут всё в соответствии с msdn, без всяких хитростей.
BOOL bRes;
INTERNET_PROXY_INFO ipi;
ipi.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
ipi.lpszProxy = szAddrPort; // в виде "abc.def.ru:xxxx" или "xxx.xxx.xxx:xxxx"
ipi.lpszProxyBypass = NULL;
bRes = InternetSetOption( NULL, INTERNET_OPTION_PROXY, &ipi, sizeof(ipi) );
Проблема в том, что вызов InternetSetOption для установки параметров авторизации
( INTERNET_OPTION_PROXY_USERNAME и INTERNET_OPTION_PROXY_PASSWORD ) с нулевым
хендлом делать нельзя.
Тогда делаю так. Генерирую ложный запрос:
SendRequest(_T("any fake request\r\n"));
Это необходимо для того, чтобы проинициализировать член
m_hConnection.
Финт здесь в следующем: несмотря на то, что запрос этот оказывается неудачным
(поскольку прокси-сервер у нас с авторизацией, а данные для авторизации мы не задали),
m_hConnection после этого всё же ненулевой и сохраняет своё значение
для последущих вызовов
SendRequest.
На этом я и сыграл.
Никакой другой альтернативы найти не удалось.
Так вот, далее, для уже НЕнулевого m_hConnection:
bRes = InternetSetOption( m_hConnection, INTERNET_OPTION_PROXY_USERNAME, m_szUser, lstrlen( m_szUser )+1 );
bRes = InternetSetOption( m_hConnection, INTERNET_OPTION_PROXY_PASSWORD, m_szPass, lstrlen( m_szPass )+1 );
Проверяю bRes == TRUE для обоих вызовов. Всё ок.
Настройка прокси и авторизации закончена.
Теперь в SOAP-методе класса-обёртки делаю два вызова:
SwitchProxy();
а затем вызов метода на сервере — в моём тестовом примере это выглядело так:
SendRequest(_T("SOAPAction: \"http://www50.brinkster.com/vbfacileinpt/np/GetPrimeNumbers\"\r\n"));
Получаю результат.
Юрий.