我已经获得了一段代码,并向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
没有别的。没有反应机构。有人对可能发生的事情有任何建议吗?它只发生在这台计算机上的事实告诉我它可能不是一个编程问题。
答案 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垃圾收集器