Получение страницы https с помощью .net HttpWebRequest или WebClient возвращает (400) Неверный запрос - PullRequest
0 голосов
/ 31 декабря 2010

У меня есть аккаунт в Interactive Brokers. У них есть достойный торговый API, но нет API для доступа к некоторым функциям управления счетами, которые доступны через их веб-сайт по адресу https://www.interactivebrokers.com/sso/Login. Я немного посмотрел на javascript, и они шифруют имя пользователя и пароль в браузере в javascript, а затем отправляют зашифрованные данные по SSL.

Я надеюсь, что смогу сделать это в C #. Первым шагом (я думаю) является открытие https://www.interactivebrokers.com/sso/Login с использованием HttpWebRequest или WebClient, чтобы получить идентификатор сеанса (это просто загрузка страницы входа в систему - даже не вводя никакого имени пользователя или пароля).

Нет ничего слишком революционного в коде. Версия WebClient:

WebClient client = new WebClient();
client.Encoding = Encoding.UTF8;
Stream data = client.OpenRead("https://www.interactivebrokers.com/sso/Login");

В версии HttpWebRequest нет ничего особенного:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.interactivebrokers.com/sso/Login");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Однако, в любом случае, когда я это делаю, я получаю

The remote server returned an error: (400) Bad Request.

Я пытался добавить пользовательский агент согласно Почему мой HttpWebRequest возвращает 400 неверный запрос? :

request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";

и

request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)";

Я все еще получаю ошибку (400).

Внутреннее исключение равно нулю, но просмотр потока WebException показывает следующий ответ (я не знаю, почему в заголовке написано '200 OK'):

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>200 OK</title>
</head><body>
<h1>OK</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>

Я посмотрел на разницу в пакетах между веб-браузером, выполняющим запрос, и моим кодом на c #, и первое отличие, которое я заметил, заключается в том, что в веб-браузере доступно гораздо больше наборов шифров, чем мой код на c #. Когда сервер отвечает на веб-браузер, он выбирает один из шифров, который недоступен в клиенте c #. Как добавить наборы шифров в HttpWebRequest / WebClient? Я еще не выяснил, действительно ли это проблема или нет.

Я что-то упускаю из виду? Почему я даже не могу загрузить эту страницу с помощью HttpWebRequest или WebClient?

Спасибо

1 Ответ

1 голос
/ 02 января 2011

Оказывается, что необходимы два заголовка (свойства в HttpWebRequest): UserAgent & Accept. Это то, что я должен был заметить с помощью WireShark, но использование Fiddler облегчило сравнение заголовков. Я замедлился, потому что сравнивал сеансы CONNECT в fiddler, и изменение useragent не влияет на заголовки соединений (не знаю, почему, но я не думаю, что это важно). Следующая строка после CONNECT правильно отражала свойства, которые я установил в HttpWebRequest, и тогда я смог выяснить, в чем дело.

Спасибо Эрику Лоу за то, что он подтолкнул меня в правильном направлении. Не имел ничего общего с Сайферс:)

...