Re[2]: клиент на ATL WebServices и прокси-сервер
От: SaloS http://salos.narod.ru/
Дата: 01.12.05 06:13
Оценка:
Здравствуйте, intr21, Вы писали:

I>Здравствуйте, intr21, Вы писали:



I>>Может, кто знает, как заставить работать такой клиент через

I>>авторизующую проксю?

I>Если кому интересно, то решение проблемы я нашёл.

I>Возможно, не самое верное и изящное, но однако оно работает.

I>У меня есть класс-обёртка CMyClass, унаследованный от CSoapSocketClientT.

I>Этот класс генерирует визард при добавлении Web Reference.
I>Меняю предка на CSoapWininetClient.
I>Добавляю метод CMyClass::SwitchProxy()

I>Весь код далее приведён для этого метода.


I>Сначала устанавливаю адрес:порт прокси сервера, используя нулевой хендл.

I>Тут всё в соответствии с msdn, без всяких хитростей.

I>
I>BOOL bRes;

I>INTERNET_PROXY_INFO ipi;
I>ipi.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
I>ipi.lpszProxy = szAddrPort; // в виде "abc.def.ru:xxxx" или "xxx.xxx.xxx:xxxx"
I>ipi.lpszProxyBypass = NULL;

I>bRes = InternetSetOption( NULL, INTERNET_OPTION_PROXY, &ipi, sizeof(ipi) );
I>

I>Проблема в том, что вызов InternetSetOption для установки параметров авторизации
I>( INTERNET_OPTION_PROXY_USERNAME и INTERNET_OPTION_PROXY_PASSWORD ) с нулевым
I>хендлом делать нельзя.

I>Тогда делаю так. Генерирую ложный запрос:


I>
I>SendRequest(_T("any fake request\r\n"));
I>

I>Это необходимо для того, чтобы проинициализировать член m_hConnection.
I>Финт здесь в следующем: несмотря на то, что запрос этот оказывается неудачным
I>(поскольку прокси-сервер у нас с авторизацией, а данные для авторизации мы не задали),
I>m_hConnection после этого всё же ненулевой и сохраняет своё значение
I>для последущих вызовов SendRequest.

I>На этом я и сыграл.

I>Никакой другой альтернативы найти не удалось.

I>Так вот, далее, для уже НЕнулевого m_hConnection:


I>
I>bRes = InternetSetOption( m_hConnection, INTERNET_OPTION_PROXY_USERNAME, m_szUser, lstrlen( m_szUser )+1 );
I>bRes = InternetSetOption( m_hConnection, INTERNET_OPTION_PROXY_PASSWORD, m_szPass, lstrlen( m_szPass )+1 );
I>

I>Проверяю bRes == TRUE для обоих вызовов. Всё ок.
I>Настройка прокси и авторизации закончена.

I>Теперь в SOAP-методе класса-обёртки делаю два вызова:


I>
I>SwitchProxy();
I>

I>а затем вызов метода на сервере — в моём тестовом примере это выглядело так:

I>
I>SendRequest(_T("SOAPAction: \"http://www50.brinkster.com/vbfacileinpt/np/GetPrimeNumbers\"\r\n"));
I>

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

Молодец , возможно это поможет и мне в будущем


I>Юрий.
WTL Helper и WTL Wizards помощники для WTL, скачать отсюда http://salos.narod.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.