Установить заголовок пользовательского агента во время HTTP CONNECT через SSL?

Я использую WebClient class в .NET 2.0 для выполнения HTTP POST через SSL.

В настоящее время я вручную устанавливаю заголовок пользовательского агента следующим образом:

wc = new WebClient();
wc.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");

Это работает нормально, за исключением случаев, когда я делаю запрос через прокси-сервер, который выполняет туннелирование HTTP и ожидает определенный заголовок пользовательского агента в команде HTTP CONNECT.

Когда прокси действует как туннель для SSL, он сначала получает HTTP CONNECT, который сообщает ему, к чему пытается подключиться клиент.

Проблема в том, что если вы устанавливаете заголовок пользовательского агента в .NET через HttpWebRequest.UserAgent или WebClient.Headers.Add, он не добавляет его в исходный запрос CONNECT. Он добавляет его к последующему SSL-трафику, но это не то, что нужно.

Если бы это был C++, я бы просто вызвал WinHttpOpen() для создания сеанса и установил параметр pwszUserAgent для установки пользовательского агента для всего сеанса. К сожалению, я не могу найти эквивалент в .NET.

Может кто-то указать мне верное направление? Я уверен, что кто-то еще должен был столкнуться с этой проблемой при создании клиентских приложений в .NET.


person Duncan Bayne    schedule 04.03.2010    source источник
comment
Кто-нибудь нашел решение для этого? У меня та же проблема с использованием внешнего веб-сервиса в клиенте, который блокирует соединения на основе заголовка UserAgent. У нас нет контроля над WebService, и HTTPS является обязательным для WebService.   -  person nflash    schedule 29.07.2013
comment
@nflash: Microsoft сообщила мне, когда я разговаривал с ними, что это было «изменение в поведении» - мне не дали никаких указаний на то, что это будет исправлено в пакетах обновлений или в будущих версиях Windows. Боюсь, ты сам по себе. С тех пор я перестал разрабатывать для Windows и теперь вместо этого использую Ruby и Javascript/Coffeescript. Такая проблема была одной из причин, по которой я изменился.   -  person Duncan Bayne    schedule 30.07.2013
comment
Спасибо за информацию. Я предполагаю, что на данный момент мне придется спросить клиента, могут ли они изменить свою политику из-за этого изменения в поведении... Вы знаете, где найти документацию от Microsoft, где описано это поведение? Такой способ будет иметь более сильный аргумент для клиента. еще раз спасибо.   -  person nflash    schedule 30.07.2013
comment
@nflash: эту информацию мне предоставил Эрик Ло, который является (или, по крайней мере, был в то время) сотрудником Microsoft. Подробности здесь: stackoverflow.com/questions/2396554/   -  person Duncan Bayne    schedule 31.07.2013
comment
Привет Дункан, у меня похожая ситуация. Вам когда-нибудь удавалось отправить юзерагент с запросом CONNECT?   -  person imlokesh    schedule 05.05.2017


Ответы (3)


Вы не сможете отправить заголовок User-Agent, используя семейство классов HttpWebRequest. В RFC говорится, что заголовок является необязательным (СЛЕДУЕТ, а не ДОЛЖЕН)

Вы можете добавить правило к прокси-серверу, чтобы разрешить соединения без заголовка User-Agent или для определенных целевых серверов, или, наконец, закодировать свой собственный HTTP-протокол, используя классы сокетов .NET.

person blowdart    schedule 08.03.2010
comment
Примерно то же самое сказали и люди из Microsoft, которых я спрашивал :-( - person Duncan Bayne; 09.03.2010

Попробуйте с HttpWebRequest (фреймворк 2.0):

HttpWebRequest httpReq = HttpWebRequest.Create(new Uri("www.website.com"));
httpReq.Headers["user-agent"] = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"; 

Я использую его с Windows Phone 7 SDK, и он работает.

Дополнительные сведения: http://msdn.microsoft.com/en-gb/library/system.net.httpwebrequest(v=vs.80).aspx

person miticojo    schedule 05.12.2012
comment
Когда вы говорите, что это работает... действительно ли он отправляет заголовок пользовательского агента во время CONNECT? Я проверил это сам, и это не так, это только добавило его к последующему трафику SSL. - person Duncan Bayne; 09.12.2012
comment
Здесь это не работает. Пользовательский агент все еще не отправлен по HTTPS CONNECT. - person mqueirozcorreia; 14.05.2017

Достаточно установить прокси

WebClient client = new WebClient();
client.Headers["User-Agent"] =
    "Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) " +
    "(compatible; MSIE 6.0; Windows NT 5.1; " +
    ".NET CLR 1.1.4322; .NET CLR 2.0.50727)";
client.Proxy = new WebProxy(your_proxy_url, true);

your_proxy_url может выглядеть как http://proxy.company.com:8080/

person whiteWoolve    schedule 27.03.2013
comment
Очевидно, вы не проверяли это и не читали объяснение выше: это ошибка Windows (извините, «изменение поведения»). Простой настройки прокси недостаточно. - person Duncan Bayne; 28.03.2013
comment
Я не тестировал под SSL правильно. Но спасибо, что сообщили мне 2 ;) - person whiteWoolve; 15.04.2013