HttpWebRequest只挂在一台电脑上

时间:2014-12-08 16:06:08

标签: c# httpwebrequest

我已经获得了一段代码,并向Google电子钱包提供了HttpWebRequest。代码在我的所有机器上运行得很好,除了我现在正在工作的这台计算机。这台计算机上的互联网工作正常(因为我现在正在使用它来输入这个问题),我们没有代理服务器在工作。

问题是它只是挂起。它甚至没有超时。它只是挂起,没有任何错误消息或任何东西,我必须强制关闭它。这是代码:

    private static string GetLoginHtml()
    {
        var request = (HttpWebRequest)WebRequest.Create(LoginUrl);
        var cookieJar = new CookieContainer();

        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.CookieContainer = cookieJar;
        using (var requestStream = request.GetRequestStream())
        {
            string content = "Email=" + Username + "&Passwd=" + Password;
            requestStream.Write(Encoding.UTF8.GetBytes(content), 0, Encoding.UTF8.GetBytes(content).Length);
            using (var sr = new StreamReader(request.GetResponse().GetResponseStream()))
            {
                string html = sr.ReadToEnd();
                string galxValue = ParseOutValue(html, "GALX");

                return GetLoginHtml2(galxValue, cookieJar);
            }
        }
    }

单步执行Visual Studio调试器上的代码,我知道它在遇到以下行时会挂起:

using (var sr = new StreamReader(request.GetResponse().GetResponseStream()))

具体来说,request.GetResponse()部分是悬而未决的部分。运行Fiddler,我看到的只是一个灰色条目,如下所示:

 3     200    HTTP            Tunnel to     accounts.google.com:443            0

没有别的。没有反应机构。有人对可能发生的事情有任何建议吗?它只发生在这台计算机上的事实告诉我它可能不是一个编程问题。

1 个答案:

答案 0 :(得分:6)

我终于弄明白了这个问题。我发布这个答案,希望它可以帮助其他人在将来不可避免的头疼。

现在是我的工作代码:

private static string GetLoginHtml()
{
    var request = (HttpWebRequest)WebRequest.Create(LoginUrl);
    var cookieJar = new CookieContainer();

    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.CookieContainer = cookieJar;
    using (var requestStream = request.GetRequestStream())
    {
        string content = "Email=" + Username + "&Passwd=" + Password;
        requestStream.Write(Encoding.UTF8.GetBytes(content), 0, Encoding.UTF8.GetBytes(content).Length);
    }
    using (var sr = new StreamReader(request.GetResponse().GetResponseStream()))
    {
        string html = sr.ReadToEnd();
        string galxValue = ParseOutValue(html, "GALX");

        return GetLoginHtml2(galxValue, cookieJar);
    }
}

我的猜测是我的requestStream在获取响应流之前没有被垃圾收集和关闭。我认为响应流是在请求流完成写入字节之前打开并读取的。 Silly .NET垃圾收集器