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"

Пишет: "В PresentationFramework.dll произошло необработанное исключение типа System.Windows.Markup.XamlParseException".

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

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


Обновление: даже если 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. Я не вижу там ничего другого, что могло бы вызвать такую ​​​​ошибку. На самом деле, я могу удалить всю сетку и все равно получить ошибку.


Обновление: я только что понял, что у меня неправильно настроены параметры исключений Visual Studio. Вот настоящая ошибка:

"В System.dll произошло первое случайное исключение типа "System.Net.WebException"

Дополнительная информация: время ожидания операции истекло"

Указывая на исходную строку в вопросе:

WebResponse getResponse = getRequest.GetResponse();

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

Обновление: похоже, что это код, вызывающий проблемы:

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

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

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


person Jason D    schedule 21.11.2013    source источник


Ответы (2)


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

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

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

person frno    schedule 21.11.2013
comment
По сути, я хочу, чтобы программа проверяла успешный вход в систему при запуске, снова запрашивала пользователя, пока не будет предоставлена ​​​​правильная информация, если ее нет, и продолжайте оттуда. Я новичок в Интернете, и я действительно понятия не имею, как правильно справиться с такой ситуацией. Если бы вы могли указать мне в правильном направлении, я был бы очень признателен. - person Jason D; 22.11.2013
comment
хорошо, если вы правильно поняли, вы хотите отправить столько сообщений, сколько потребуется для входа пользователя с помощью WebRequest ... а затем, я полагаю, после проверки какого-либо успешного входа в систему продолжите работу с приложением. Однако я не понимаю смысла, если вы хотите имитировать браузер, то этот подход не очень хорош, я думаю. Если у вас есть возможность сделать что-то на стороне сервера, создайте API, в противном случае рассмотрите возможность использования видимого или скрытого элемента управления WebBrowser wpf, где вы можете выполнять действия на странице навигации, и фактический вход в систему действительно происходит. - person frno; 22.11.2013
comment
... но если вы знаете, что с правильными заголовками и именем пользователя/паролем вам возвращаются данные (текст страницы), которые вам нужны в ответе, и это все, что вам нужно, рассмотрите возможность создания одного веб-запроса на кнопку OnClick of Login, например, в ваш CredentialView и закройте его только после того, как вы получите необходимые данные, а затем сохраните их перед закрытием - person frno; 22.11.2013
comment
Спасибо за совет. Как я уже сказал, я новичок в таких вещах, но я отработаю ваши предложения и посмотрю, что я могу сделать. - person Jason D; 22.11.2013
comment
Спасибо за вашу помощь. Я понял это, и, поскольку ваши комментарии направили меня туда, я с радостью приму ваш ответ. - person Jason D; 22.11.2013

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

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

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

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

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

person frno    schedule 21.11.2013