У меня есть следующие методы для получения данных с веб-сайта я использую: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, или что-нибудь в этом роде. Каким будет правильный способ попытаться войти в систему при запуске, а затем запросить правильные учетные данные, если первоначальная проверка не удалась? Я хотел бы узнать, как сделать это правильно, чтобы в будущем может быть более успешным. Любой совет, который вы могли бы мне дать, действительно оценили бы.
По сути, я хочу, чтобы программа проверила успешный вход в систему при запуске, запросите пользователя еще раз, пока не появится соответствующая информация, если его нет, и оттуда оттуда. Я новичок в Интернете, и я действительно не знаю, как правильно обращаться с такой ситуацией. Если бы вы могли указать мне в правильном направлении, я бы очень признателен. –
хорошо, если вы правильно понимаете, вы хотите отправить столько сообщений, сколько требуется для входа в систему с помощью WebRequest ... и я полагаю, что после проверки какого-то успешного входа в систему приступайте к приложению. Я не понимаю смысла, хотя, если вы хотите имитировать браузер, то этот подход не подходит, я думаю. Если у вас есть возможность что-то сделать на стороне сервера, создайте api, иначе рассмотрите использование видимого или скрытого элемента управления wpf WebBrowser, где вы можете действовать на навигационной странице, и фактический логин действительно происходит – frno
... но если вы знаете, что с соответствующими заголовками и имя пользователя/пароль, которые вы получили, возвратили данные (текст страницы), которые вам нужны в ответ, и это все, что вам нужно, а затем подумайте о том, чтобы создать единый WebRequest на кнопке OnClick of Login, например, в вашем CredentialView и закрыть его только после того, как вы получили данные вам нужно, а затем хранить их перед закрытием – frno