当我运行下面包含的程序时,第一个HTTPS请求成功,但第二个请求失败。两个url都有效,可以在浏览器中成功访问。有关成功访问第二个网址需要做什么的任何建议吗?
using System;
using System.IO;
using System.Net;
public class Program
{
private static void Main(string[] args)
{
var content = "";
bool status;
var url1 = "https://mail.google.com";
var url2 = "https://my.ooma.com";
status = DoHttpRequest(url1, out content);
OutputStatus(url1, status, content);
status = DoHttpRequest(url2, out content);
OutputStatus(url2, status, content);
Console.ReadLine();
}
private static void OutputStatus(string url, bool status, string content)
{
if (status) Console.WriteLine("Url={0}, Status=Success, content length = {1}", url, content.Length);
else Console.WriteLine("Url={0}, Status=Fail, ErrorMessage={1}", url, content);
}
private static bool DoHttpRequest(string url, out string content)
{
content = "";
var request = (HttpWebRequest) WebRequest.Create(url);
try
{
request.Method = "GET";
request.CookieContainer = null;
request.Timeout = 25000; // 25 seconds
var response = (HttpWebResponse) request.GetResponse();
var streamReader = new StreamReader(response.GetResponseStream());
content = streamReader.ReadToEnd();
return true;
}
catch (WebException ex)
{
content = ex.Message;
return false;
}
}
}
答案 0 :(得分:3)
从历史上看,当你忘记在GetResponseStream()返回的对象上调用.Close()时,我看到的这个描述的大多数问题就出现了。存在问题是因为当您忘记关闭第一个请求时,第二个请求会死锁,等待空闲连接。
通常,此挂起发生在第3个请求上,而不是第二个请求。
更新:查看您的repro,这与请求的顺序无关。您遇到了问题,因为此站点在HTTPS握手开始时发送TLS警告,并且.NET会在发生这种情况时超时。见http://blogs.msdn.com/b/fiddler/archive/2012/03/29/https-request-hangs-.net-application-connection-on-tls-server-name-indicator-warning.aspx。问题仅在Windows Vista及更高版本上进行了重新编译,因为警告与WinXP上的HTTPS堆栈中不存在的TLS扩展相关。
答案 1 :(得分:1)
提出请求TimeOut。
request.Timeout = 60000; //60 second.
可能是你的网络连接有点慢。我跑了25秒,好吧。 (是的,第二个网址比第一个网址要长一点。)