Re: клиент на ATL WebServices и прокси-сервер
От: intr21  
Дата: 30.11.05 21:54
Оценка:
Здравствуйте, 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"));

Получаю результат.


Юрий.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.