Работа через прокси
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 19.09.06 09:09
Оценка:
Нужно передавать данные через прокси сервер на удаленный сервер. Прокси сервер использует NTLM аутентификацию. Следующий код должен посылать запрос и получать ответ:

String ^ProcessData( String ^data )
{
    if ( m_rUrl == nullptr )
        throw gcnew WebException( FORMAT_STR_NOT_CPECIFY_SERVER_URL );

    NetworkCredential ^cred = nullptr;

    if ( m_useProxy )
    {
        if ( m_proxyUrl == nullptr )
            throw gcnew WebException( FORMAT_STR_NOT_CPECIFY_PROXY_URL );
                
        if ( m_useProxyAuth )
        {
            if ( m_proxyUserName == nullptr || m_proxyUserPasswd == nullptr )
                        throw gcnew WebException( FORMAT_STR_NOT_CPECIFY_PROXY_CREDENTIALS );

            cred = gcnew NetworkCredential( m_proxyUserName, m_proxyUserPasswd );
        }

        m_rWebClient.Proxy = gcnew WebProxy( m_proxyUrl, false, nullptr, cred );
    }
    else
    {
        if ( m_rWebClient.Proxy != nullptr )
            m_rWebClient.Proxy = nullptr;
    }

    array<Byte>    ^postArray = Encoding::ASCII->GetBytes( data );
    array<Byte>    ^responseArray = m_rWebClient.UploadData( m_rUrl, postArray );
    return Encoding::ASCII->GetString( responseArray );
}


Как результат я получаю ошибку 407 — необходима авторизация...
Смотрел сниффером что происходит. Все делается правильно за единственным исключением. Неопределен заголовок "Proxy-Connection: Keep-Alive". Я попробовал добавить его руками
m_rWebClient.Headers->Add( "Proxy-Connection", "Keep-Alive" );

но во время обращения к серверу я получил ошибку:

"This header must be modified using the appropriate property. Parameter name: name".

И что интересно, соответстующего Property я не нашел ...
Как же мне заставить посылаться этот header?
Любая задача имеет решение, даже когда решения не существует
Re: Работа через прокси
От: Mika Soukhov Stock#
Дата: 19.09.06 09:14
Оценка:
Здравствуйте, Burd, Вы писали:

B>И что интересно, соответстующего Property я не нашел ...

B>Как же мне заставить посылаться этот header?

У WebClient можно переопределить метод GetWebRequest и у HttpWebRequest выставить свойство KeepAlive.
Re[2]: Работа через прокси
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 19.09.06 09:57
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>У WebClient можно переопределить метод GetWebRequest


Хеадер добавляется... Вот только когда вызывается метод UploadData, валится исключение:
"This header must be modified using the appropriate property. Parameter name: name".
Любая задача имеет решение, даже когда решения не существует
Re[2]: Работа через прокси
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 19.09.06 10:06
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

>> HttpWebRequest выставить свойство KeepAlive.


Я выставлял, посылается header: "Connection: Keep-Alive", а не "Proxy-Connection: Keep-Alive".
Любая задача имеет решение, даже когда решения не существует
Re: Работа через прокси
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 19.09.06 10:26
Оценка:
В группах гугля также обсуждается эта проблемма, например здесь
Ответа нет...
Помогите... Оч надо!
Любая задача имеет решение, даже когда решения не существует
Re: Работа через прокси
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 19.09.06 10:47
Оценка:
Вот нашел в MSDN:

The WebHeaderCollection class is generally accessed through WebRequest.Headers or WebResponse.Headers. Some common headers are considered restricted and are either exposed directly by the API (such as Content-Type) or protected by the system and cannot be changed.

The restricted headers are:
Accept
Connection
Content-Length
Content-Type
Date
Expect
Host
If-Modified-Since
Range
Referer
Transfer-Encoding
User-Agent
Proxy-Connection



Это означает что я не смогу редактировать Proxy-Connection поле???
Любая задача имеет решение, даже когда решения не существует
Re[2]: Работа через прокси
От: Mika Soukhov Stock#
Дата: 19.09.06 11:00
Оценка:
Здравствуйте, Burd, Вы писали:

B>В группах гугля также обсуждается эта проблемма, например здесь

B>Ответа нет...
B>Помогите... Оч надо!

Попробуй в AuthenticationManager зарегистрировать свой модуль и Authorization.Message записать Keep-Alive. Хотя странно, что так не работает. Может прокси самопальная?
Re[2]: Работа через прокси
От: stump http://stump-workshop.blogspot.com/
Дата: 19.09.06 11:21
Оценка:
Здравствуйте, Burd, Вы писали:

B>Вот нашел в MSDN:

B>

B>The WebHeaderCollection class is generally accessed through WebRequest.Headers or WebResponse.Headers. Some common headers are considered restricted and are either exposed directly by the API (such as Content-Type) or protected by the system and cannot be changed.

B>The restricted headers are:
B>Accept
B>Connection
B>Content-Length
B>Content-Type
B>Date
B>Expect
B>Host
B>If-Modified-Since
B>Range
B>Referer
B>Transfer-Encoding
B>User-Agent
B>Proxy-Connection



B>Это означает что я не смогу редактировать Proxy-Connection поле???


D MSDN для System.Net.WebHeaderCollection другой список запрещенных к изменению хидеров

The restricted headers are:

Accept
Connection
Content-Length
Content-Type
Date
Expect
Host
If-Modified-Since
Range
Referer
Transfer-Encoding
User-Agent

так что можно попробовать System.Net.HttpWebRequest.Headers.Add()
Мне интересно потому что сам как то столкнулся с 407 ошибкой на MS ISA прокси. Решения так и не нашел.
Так что напиши если получится. Оч интересно.
Понедельник начинается в субботу
Re[3]: Работа через прокси
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 19.09.06 11:23
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>Попробуй в AuthenticationManager зарегистрировать свой модуль и Authorization.Message записать Keep-Alive.


Спасибо, попробую...

MS>Может прокси самопальная?


Гы, боюсь это у нашего админа руки кривые... Но к сожалению доступа к проксе нет. Админ злой (потому что не может разобратся в проблеме, или потому что не хочет). Поэтому приходится выкручиваться...
Любая задача имеет решение, даже когда решения не существует
Re[3]: Работа через прокси
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 20.09.06 11:40
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:


MS>и Authorization.Message записать Keep-Alive. Хотя странно, что так не работает.


Попробовал... Authorization.Message имеет только метод get. А переменная, которая отвечает свойству m_message находится в приват секции .
Любая задача имеет решение, даже когда решения не существует
Re[4]: Работа через прокси
От: Mika Soukhov Stock#
Дата: 20.09.06 12:19
Оценка:
Здравствуйте, Burd, Вы писали:

B>Здравствуйте, Mika Soukhov, Вы писали:



MS>>и Authorization.Message записать Keep-Alive. Хотя странно, что так не работает.


B>Попробовал... Authorization.Message имеет только метод get. А переменная, которая отвечает свойству m_message находится в приват секции .


Посмотри по-лучше, там передается через конструктор.
Re[5]: Работа через прокси
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 20.09.06 13:15
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

Эх, сделал как ты сказал, сформировал строчку с паролем, в конец прибавил к ней нужный хеадер
BasicToken += "\r\nProxy-Connection: Keep-Alive";

Вот только теперь при запросе валится новый ексепшн:

"Specified value has invalid CRLF characters. Parameter name: value"


Вот это мрак... Вижу что ручками всунуть это поле никак не удастся... Хорошо они ограничение сделали... Надо наверное искать спецификации по работе прокси-серверов, сравнивать с реальными данными и слать Bug-report'ы в Майкрософт ...
Если есть еще идеи, подкидывайте... А то у меня они уже иссякли .
Любая задача имеет решение, даже когда решения не существует
Re[6]: Работа через прокси
От: Mika Soukhov Stock#
Дата: 20.09.06 13:24
Оценка:
Здравствуйте, Burd, Вы писали:

B>Здравствуйте, Mika Soukhov, Вы писали:


B>Эх, сделал как ты сказал, сформировал строчку с паролем, в конец прибавил к ней нужный хеадер

B>
B>BasicToken += "\r\nProxy-Connection: Keep-Alive";
B>


BasicToken += "Keep-Alive";

B>Вот только теперь при запросе валится новый ексепшн:


B>"Specified value has invalid CRLF characters. Parameter name: value"



B>Вот это мрак... Вижу что ручками всунуть это поле никак не удастся... Хорошо они ограничение сделали... Надо наверное искать спецификации по работе прокси-серверов, сравнивать с реальными данными и слать Bug-report'ы в Майкрософт ...

B>Если есть еще идеи, подкидывайте... А то у меня они уже иссякли .
Re[7]: Работа через прокси
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 20.09.06 13:33
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>BasicToken += "Keep-Alive";


Сделал и так... Так он просто это поле в конец пароля добавил . То есть этот вариант не конает .
Любая задача имеет решение, даже когда решения не существует
Re[7]: Работа через прокси
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 20.09.06 18:34
Оценка:
День мучительной работы вот к чему привел...

Чтобы добавить заголовок с Proxy-Connection пришлось написать свой TCP прокси-сервер, который перенаправлял запросы на HTTP прокси с добавлением необходимого поля. Как ни странно, ошибка повторилась! Попробовал сравнить запросы ИЕ и моего проксика. Аутентификация на HTTP прокси делается через NTLM. Насколько я понял, эта аутентификация делается в 2 захода — первый — посылается всегда одна и та же строка и обрабатывается ответ сервера (ИЕ посылает всегда одну и ту же строчку). Второй — по ответу и посланой строке строится аналог хеш сумы имя пользователя и пароля...
Так вот, первый запрос разный в моей программе и в ИЕ...

В этом ли грабли и если да, то как с ними бороться?
Любая задача имеет решение, даже когда решения не существует
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.