我有一段代码可以输出到Google Wallet,并执行HttpWebRequest。该代码在我所有的机器上都可以正常工作,除了我现在正在使用的这台计算机上。这台计算机上的Internet正常运行(因为我现在正在使用它来键入此问题),并且我们没有代理服务器在工作。

问题在于它只是挂起。甚至没有超时。它只是挂起而没有任何错误信息或任何东西,我不得不强行关闭它。这是代码:

    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

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

最佳答案

我终于弄明白了这个问题。我正在发布此答案,希望将来对某些人的头部擦伤有帮助。

现在是我的工作代码:

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进行垃圾收集和关闭。我认为响应流在请求流完成其字节写入之前就处于打开和读取状态。愚蠢的.NET垃圾收集器

关于c# - HttpWebRequest刚卡在一台计算机上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27361962/

10-12 14:21