HttpWebRequest 导致应用挂起
HttpWebRequest causes application to hang
我遇到了一个奇怪的问题。我在 Visual Studio 2013 年创建了一个应用程序,该应用程序在 Windows 中运行良好。然后我将它移植到 Mono,因为我需要在 Linux 控制台中将应用程序移植到 运行。
该应用程序在 Mono 中运行良好,但现在在 Windows 中停止运行。源代码是相同的。它实际上是 Mono 源代码的复制和粘贴。当我 运行 Windows 中的应用程序时,它只是出现了一个黑色控制台 window 和 "hangs"。这是挂起的代码:
static void Main(string[] args)
{
string orders = GetLoginHtml();
Console.WriteLine(orders);
}
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);
// The next line is where it hangs
using (var sr = new StreamReader(request.GetResponse().GetResponseStream()))
{
string html = sr.ReadToEnd();
string galxValue = ParseOutValue(html, "GALX");
return GetLoginHtml2(galxValue, cookieJar);
}
}
}
我评论了挂线的地方。我不知道为什么,至少,它没有给我超时错误。我 运行 fiddler 并且我看到它试图出去,但是 Fiddler 只是立即报告一个关闭的连接。我的互联网工作正常,URL 工作正常,如果我使用浏览器访问它。有什么建议么?
我终于弄明白了这个问题。我发布这个答案是希望它能帮助其他人在未来不可避免地挠头。
这是我现在的工作代码:
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 在获取响应流之前没有被垃圾收集和关闭。我认为在请求流完成写入其字节之前,响应流已被打开和读取。 Mono 一定足够聪明,可以在开始读取之前完成写入。无论如何,它现在可以在 Windows 和 Mono 中使用了!愚蠢的 .NET 垃圾收集器。
我遇到了一个奇怪的问题。我在 Visual Studio 2013 年创建了一个应用程序,该应用程序在 Windows 中运行良好。然后我将它移植到 Mono,因为我需要在 Linux 控制台中将应用程序移植到 运行。
该应用程序在 Mono 中运行良好,但现在在 Windows 中停止运行。源代码是相同的。它实际上是 Mono 源代码的复制和粘贴。当我 运行 Windows 中的应用程序时,它只是出现了一个黑色控制台 window 和 "hangs"。这是挂起的代码:
static void Main(string[] args)
{
string orders = GetLoginHtml();
Console.WriteLine(orders);
}
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);
// The next line is where it hangs
using (var sr = new StreamReader(request.GetResponse().GetResponseStream()))
{
string html = sr.ReadToEnd();
string galxValue = ParseOutValue(html, "GALX");
return GetLoginHtml2(galxValue, cookieJar);
}
}
}
我评论了挂线的地方。我不知道为什么,至少,它没有给我超时错误。我 运行 fiddler 并且我看到它试图出去,但是 Fiddler 只是立即报告一个关闭的连接。我的互联网工作正常,URL 工作正常,如果我使用浏览器访问它。有什么建议么?
我终于弄明白了这个问题。我发布这个答案是希望它能帮助其他人在未来不可避免地挠头。
这是我现在的工作代码:
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 在获取响应流之前没有被垃圾收集和关闭。我认为在请求流完成写入其字节之前,响应流已被打开和读取。 Mono 一定足够聪明,可以在开始读取之前完成写入。无论如何,它现在可以在 Windows 和 Mono 中使用了!愚蠢的 .NET 垃圾收集器。