2013-11-21 4 views
0

У меня есть следующие методы для получения данных с веб-сайта я использую:WebRequest/WebResponse раз на свежий логин

private WebResponse GetWebResponse() 
    { 
     string formUrl = "https://www.draftkings.com/account/login"; 
     string formParams = string.Format(
      "login={0}&password={1}&returnUrl=", 
      Credentials.ToInsecureString(Credentials.DecryptString(Settings.Default.UserName)), 
      Credentials.ToInsecureString(Credentials.DecryptString(Settings.Default.Password))); 
     WebRequest req = WebRequest.Create(formUrl); 
     req.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; 
     req.Method = "POST"; 
     byte[] bytes = Encoding.ASCII.GetBytes(formParams); 
     req.ContentLength = bytes.Length; 
     using (Stream os = req.GetRequestStream()) 
     { 
      os.Write(bytes, 0, bytes.Length); 
     } 
     return req.GetResponse(); 
    } 

    private string GetTransactions() 
    {    
     var cookieHeader = GetWebResponse().Headers["Set-cookie"]; 

     while (cookieHeader.StartsWith("u=; domain")) 
     { 
      var loginWindow = new CredentialView(); 
      loginWindow.ShowDialog(); 
      cookieHeader = GetWebResponse().Headers["Set-cookie"]; 
     } 

     string pageSource; 
     string getUrl = "https://www.draftkings.com/account/transactions"; 
     WebRequest getRequest = WebRequest.Create(getUrl); 
     getRequest.Headers.Add("Cookie", cookieHeader); 
     getRequest.Timeout = 20000; 
     WebResponse getResponse = getRequest.GetResponse(); 
     using (StreamReader sr = new StreamReader(getResponse.GetResponseStream())) 
     { 
      pageSource = sr.ReadToEnd(); 
     }    

     return pageSource; 
    } 

В случае, если у меня есть мои учетные данные сохранены, программа работает отлично. Однако, если я использую свежий логин, программа получает к этой линии и вешает:

WebResponse getResponse = getRequest.GetResponse(); 

После возникновения тайм-аут, я получаю ошибку XAML, указывая на этой линии:

xmlns:oxy="http://oxyplot.codeplex.com" 

Это говорит : «Необработанное исключение типа« System.Windows.Markup.XamlParseException »произошло в PresentationFramework.dll«

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

Если у кого-нибудь есть какие-либо советы или рекомендации относительно того, как исправить это, любая помощь будет принята с благодарностью. Благодарю.


Update: Даже с OxyPlot полностью удалены из моего XAML, ошибка все еще брошен. Сам XAML очень прост:

<Window x:Class="DraftKingsTracker.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:oxy="http://oxyplot.codeplex.com" 
     Title="DraftKings Tracker" Height="768" Width="1024"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Button Content="Account" 
       Command="{Binding CommandAccount}" 
       HorizontalAlignment="Left" 
       Margin="5" /> 
     <oxy:Plot Grid.Row="1" 
        Model="{Binding PlotModel}" 
        Margin="10" /> 
    </Grid> 
</Window> 

С OxyPlot удален, ошибка указывает на строку 3 из MainWindow.xaml. Я не вижу в этом ничего другого, что могло бы вызвать такую ​​ошибку. Фактически, я могу удалить всю сетку и все еще получить ошибку.


Update: Я просто понял, что я имел настройки исключений из Visual Studio настроен неправильно. Вот реальная ошибка:

«Первый шанс исключение типа„System.Net.WebException“произошло в System.dll

Дополнительная информация: Операция истекло»

Указывая на исходной линии в вопросе:

WebResponse getResponse = getRequest.GetResponse(); 

Как я уже сказал, это происходит только в том случае, если программа запущена без надлежащей информации для входа в систему. Если я перезапущу после его сбоя, предполагая, что я ввел правильную информацию с первой попытки, проблем нет.

Update: Похоже, это код, который вызывает проблемы:

var cookieHeader = GetWebResponse().Headers["Set-cookie"]; 

    while (cookieHeader.StartsWith("u=; domain")) 
    { 
     var loginWindow = new CredentialView(); 
     loginWindow.ShowDialog(); 
     cookieHeader = GetWebResponse().Headers["Set-cookie"]; 
    } 

У меня нет никакого опыта, когда речь заходит об использовании WebRequests, WebResponses, или что-нибудь в этом роде. Каким будет правильный способ попытаться войти в систему при запуске, а затем запросить правильные учетные данные, если первоначальная проверка не удалась? Я хотел бы узнать, как сделать это правильно, чтобы в будущем может быть более успешным. Любой совет, который вы могли бы мне дать, действительно оценили бы.

ответ

1

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

while (cookieHeader.StartsWith("u=; domain")) 
    { 
     var loginWindow = new CredentialView(); 
     loginWindow.ShowDialog(); 
     cookieHeader = GetWebResponse().Headers["Set-cookie"]; 
    } 

первую очередь я не уверен «а» правильная вещь здесь, во-вторых, вы звоните GetWebResponse() снова который замерзает приложение (которое я быстросъемные созданный) вы уже вызвали его до того, как statemenet

+0

По сути, я хочу, чтобы программа проверила успешный вход в систему при запуске, запросите пользователя еще раз, пока не появится соответствующая информация, если его нет, и оттуда оттуда. Я новичок в Интернете, и я действительно не знаю, как правильно обращаться с такой ситуацией. Если бы вы могли указать мне в правильном направлении, я бы очень признателен. –

+0

хорошо, если вы правильно понимаете, вы хотите отправить столько сообщений, сколько требуется для входа в систему с помощью WebRequest ... и я полагаю, что после проверки какого-то успешного входа в систему приступайте к приложению. Я не понимаю смысла, хотя, если вы хотите имитировать браузер, то этот подход не подходит, я думаю. Если у вас есть возможность что-то сделать на стороне сервера, создайте api, иначе рассмотрите использование видимого или скрытого элемента управления wpf WebBrowser, где вы можете действовать на навигационной странице, и фактический логин действительно происходит – frno

+0

... но если вы знаете, что с соответствующими заголовками и имя пользователя/пароль, которые вы получили, возвратили данные (текст страницы), которые вам нужны в ответ, и это все, что вам нужно, а затем подумайте о том, чтобы создать единый WebRequest на кнопке OnClick of Login, например, в вашем CredentialView и закрыть его только после того, как вы получили данные вам нужно, а затем хранить их перед закрытием – frno

0

пространство имен, которое вы предоставили (oxyplot), указывает на то, что проблема связана с элементами управления, которые вы используете из этой библиотеки.

Я вижу Тхо основные варианты:

1) Вы можете приложить полный проект напрямую (oxyplot) к вашему решению и попытаться увидеть, где эта проблема может быть

2) Вы говорите, что, когда ты есть данные, он работает хорошо. Поэтому, скорее всего, некоторые привязки вызывают проблемы, если вы не получите ответ. Поэтому старайтесь избегать использования элементов управления из oxyplot из этой библиотеки в целом, если вы не получите результат (используйте код, конвертер или шаблонный)

также, ваш XAML будет, вероятно, более полезным здесь .....

+0

Я обновил свой пост. –

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