У меня есть следующие методы для получения данных с веб-сайта, который я использую:
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 или чего-либо в этом роде. Каким будет правильный способ попытаться войти в систему при запуске, а затем запросить правильные учетные данные, если первоначальная проверка не удалась? Я хотел бы узнать, как сделать это правильно, чтобы быть более успешным в будущем. Любые советы, которые вы могли бы дать мне, будут действительно оценены.