Сбой HTTPS веб-запроса - PullRequest
       1

Сбой HTTPS веб-запроса

2 голосов
/ 28 марта 2012

Когда я запускаю программу, содержащуюся ниже, первый запрос 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;
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Исторически сложилось, что большинство проблем этого описания, которые я видел, возникают, когда вы забываете вызывать .Close () для объекта, возвращаемого из GetResponseStream ().Проблема существует, потому что, когда вы забудете закрыть первый запрос, второй запрос блокируется в ожидании свободного соединения.

Обычно такое зависание происходит на 3-м запросе, а не на втором.

Обновление : Глядя на ваше репро, это не имеет никакого отношения к порядку запросов.Вы столкнулись с проблемой, потому что этот сайт отправляет предупреждение TLS в начале рукопожатия HTTPS, и .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 и более поздних версиях, поскольку предупреждение относится к расширению TLS, которого нет в стеке HTTPS в WinXP.

1 голос
/ 28 марта 2012

Увеличьте ваш запрос TimeOut.

request.Timeout = 60000; //60 second.

Возможно, ваше сетевое соединение немного медленное.Я бегу с 25 секундами, хорошо.( Да, второй URL-адрес для получения ответа немного длиннее, чем первый. )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...