У меня есть учетная запись в Interactive Brokers. У них есть неплохой торговый API, но нет API для доступа к некоторым функциям управления учетными записями, которые доступны через их веб-сайт по адресу https://www.interactivebrokers.com/sso/Login. Я немного посмотрел на javascript, и они шифруют имя пользователя & пароль в браузере в javascript, а затем отправляют зашифрованные файлы через SSL.Извлечение https-страницы с использованием .net HttpWebRequest или WebClient возвращает (400) Неверный запрос
Я надеюсь, что смогу сделать это в 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.
Я попытался добавить пользовательский агент в соответствии с Why Does my HttpWebRequest Return 400 Bad request?:
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#, и первое отличие, которое я заметил, это то, что в веб-браузере доступно еще много доступных наборов cypher, а затем мой код C#. Когда сервер отвечает на веб-браузер, он выбирает один из шифров, который недоступен в клиенте C#. Как добавить комплекты cypher в HttpWebRequest/WebClient? Я еще не понял, действительно ли это проблема или нет.
Я пропустил что-то действительно основное? Почему я не могу загрузить эту страницу с помощью HttpWebRequest или WebClient?
Благодаря
Очень маловероятно, что это связано с шифрами. Установите Fiddler, включите режим дешифрования HTTPS (Tools> Fiddler Options> HTTPS), а затем сравните запрос со своего браузера и вашего приложения. – EricLaw