HTTPS Web请求失败

时间:2012-03-28 03:47:48

标签: c# .net http https

当我运行下面包含的程序时,第一个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;
        }
    }
}

2 个答案:

答案 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秒,好吧。 (是的,第二个网址比第一个网址要长一点。