C # Не могу повторно использовать соединения Http. Нет заголовка KeepAlive. HttpWebRequest.KeepAlive = true; - PullRequest
0 голосов
/ 06 июля 2010

Хорошо.Вот полный код.Я пытался повторно использовать настройки соединения KeepAlive, но он просто не работает.Я просматривал сообщения Http, используя Feedler и Charles, но все, что я вижу, это Connection: close в ответе.

Я вижу 600 TCP-соединений в состоянии ожидания, открытых 10 потоками.Каждый поток запускает один запрос http за раз.

Существует также множество ответов, которые говорят - запрос без аутентификации.Сервис требует дайджест-аутентификации.Код, очевидно, является статическим и просто запускает один и тот же запрос несколько сотен раз из разных потоков ... Так почему некоторые запросы не проходят аутентификацию ??Я

    static void GetRest(string rest)
    {
        int i = Interlocked.Increment(ref counter);

        Uri uri = new Uri(rest);
        CredentialCache cc = new CredentialCache();
        cc.Add(uri, "Digest", new NetworkCredential("zz", "zz"));

        ServicePointManager.FindServicePoint(uri).SetTcpKeepAlive(true, 6000000, 100000);
        ServicePointManager.FindServicePoint(uri).ConnectionLimit = 5;

        while (!stop)
        {

            HttpWebRequest req = WebRequest.Create(rest) as HttpWebRequest;

            req.Credentials = cc;
            req.Method = "GET";
            req.Timeout = timeout;
            req.KeepAlive = true;

            try
            {
                using (HttpWebResponse res = (HttpWebResponse)req.GetResponse())
                {
                    StreamReader sr = new StreamReader(res.GetResponseStream());

                    string result = sr.ReadToEnd().Substring(0, 20);
                    int rc = Interlocked.Increment(ref responseCounter);
                    Console.Write(".");

                    Thread.Sleep(20);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("EXCEPTION {0}, {1}", i, ex.Message);
                Interlocked.Increment(ref badResponseCounter);
            }
        }

        Interlocked.Decrement(ref counter);
    }

Ответы [ 2 ]

1 голос
/ 06 июля 2010

Если вы видите Connection: Close в ответе, не означает ли это, что сервер принудительно закрывает соединение после каждого запроса.Я не уверен, что вы можете сделать что-то, чтобы изменить это поведение.Возможно, вы могли бы спросить поставщика услуг, почему они возвращают Connection: Close в каждом ответе.

0 голосов
/ 11 февраля 2015

У меня была похожая проблема, которая исчезла после того, как я установил request.UnsafeAuthenticatedConnectionSharing = true и ServicePointManager.MaxServicePointIdleTime = 100000; // не должно быть 0

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