HTTPS Web请求失败

当我运行下面包含的程序时,第一个HTTPS请求成功,但第二个请求失败。 两个url都是有效的,并且都可以在浏览器中成功访问。 有关成功访问第二个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; } } } 

从历史上看,当您忘记在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扩展相关。

增加您的请求TimeOut。

 request.Timeout = 60000; //60 second. 

可能是你的网络连接有点慢。 我跑了25秒,好吧。 ( 是的,第二个url比第一个url要长一点。