WebRequest / WebResponse在新登录时超时

时间:2013-11-21 20:11:44

标签: c# 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'类型的未处理异常”

如果我在保存登录信息的情况下继续重启程序,则没有问题。它仍然向网站提出相同的请求以获取数据,我不知道为什么会发生这种情况或如何解决它。

如果有人对如何解决此问题有任何提示或建议,将非常感谢任何帮助。感谢。


更新:即使从我的XAML中完全删除了OxyPlot,仍然会抛出错误。 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后,错误指向MainWindow.xaml的第3行。我没有看到任何会导致这种错误的其他内容。事实上,我可以删除整个网格,但仍然会收到错误。


更新:我刚刚意识到我错误地配置了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或其他任何性质时,我根本没有任何经验。尝试在启动时登录,然后在初始检查失败时提示输入正确的凭据的正确方法是什么?我想知道如何以正确的方式这样做,以便将来可能更成功。你能给我的任何建议都会非常感激。

2 个答案:

答案 0 :(得分:1)

更新后,我认为您的问题存在于此处:

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

首先我不确定'while'在这里是正确的事情,其次,你再次调用GetWebResponse()冻结应用程序(我快速创建)你之前调用它而statemenet

答案 1 :(得分:0)

您提供的

命名空间(oxyplot)表明问题出在您从该库中使用的控件中。

我看到了基本选项:

1)您可以直接将一个完整的项目(oxyplot)附加到您的解决方案,并尝试查看问题所在

2)你说当你有数据时,它运作良好。因此,如果您没有得到响应,最有可能某些绑定会导致问题。因此,如果你没有得到结果(使用代码,转换器或模板),尽量避免使用来自该库的oxyplot的控件

另外,你的xaml在这里可能会更有帮助.....