2010-12-31 5 views
0

У меня есть учетная запись в 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?

Благодаря

+1

Очень маловероятно, что это связано с шифрами. Установите Fiddler, включите режим дешифрования HTTPS (Tools> Fiddler Options> HTTPS), а затем сравните запрос со своего браузера и вашего приложения. – EricLaw

ответ

1

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

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

Смежные вопросы