SslStream Read производительность
От: codenet Россия  
Дата: 18.02.15 22:06
Оценка: :)
Доброго времени суток коллеги!

накипел один вопрос:
Есть очень простой пример
        protected static bool OnCertificateValidation(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;
        }
        private static void Main(string[] args)
        {
            var url = new Uri("https://www.okcoin.cn");
            IPEndPoint connectPoint = new IPEndPoint(Dns.GetHostAddresses(url.Host).First(), url.Port);
            var sb = new StringBuilder();
            sb.AppendLine("GET /api/ticker.do?symbol=btc_cny HTTP/1.1");
            sb.AppendLine("User-Agent: Tester");
            sb.AppendLine("Host: www.okcoin.cn");
            sb.AppendLine();
            var headerBytes = Encoding.UTF8.GetBytes(sb.ToString());
            var sw = new Stopwatch();
            for (int i = 0; i <= 10; i++)
            {
                sw.Start();
                using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                {
                    socket.Connect(connectPoint);
                    using (var stream = new NetworkStream(socket, true))
                    {
                        var callback = new RemoteCertificateValidationCallback(OnCertificateValidation);
                        //using ( var sslStream = new SslStream(stream))
                        using (var sslStream = new SslStream(stream, false, callback))
                        {
                            sslStream.AuthenticateAsClient(url.Host);
                            sslStream.Write(headerBytes, 0, headerBytes.Length);
                            sslStream.Flush();
                            var buffer = new byte[2048];
                            var bytes = 0;
                            while ((bytes = sslStream.Read(buffer, 0, buffer.Length)) > 0) //<<<< тут
                                Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, bytes));

                        }
                    }
                }
                sw.Stop();
                Console.WriteLine(">>>>>>>>>>>>>>>>>>ms {0}", sw.ElapsedMilliseconds);
                sw.Reset();
            }
            Console.WriteLine("end");
            Console.ReadKey();
        }

все работает,все отлично,Но падает очень сильно производительность на момент чтения последнего пакета ,
из за этого одна итерация цикла выполняется по 11-13 секунд. Не могу понять где я ошибся,fiddler выполняет запрос за 0.3 сек ,у меня тоже достаточно быстро все выполняется,
но вешается на чтении последнего пакета,спасибо за советы!
Отредактировано 18.02.2015 22:11 codenet . Предыдущая версия . Еще …
Отредактировано 18.02.2015 22:10 codenet . Предыдущая версия .
Отредактировано 18.02.2015 22:08 codenet . Предыдущая версия .
SslStream Read производительность
Re: SslStream Read производительность
От: vorona  
Дата: 19.02.15 08:23
Оценка: 2 (1)
Здравствуйте, codenet, Вы писали:

Клиент ждет ответа от сервера, сервер ничего не шлет.
Сервер обрывает соединение по таймауту.

Вам нужно разбирать http header, что бы понять длину сообщения.
Re[2]: SslStream Read производительность
От: codenet Россия  
Дата: 19.02.15 21:08
Оценка:
Здравствуйте, vorona, Вы писали:

V>Здравствуйте, codenet, Вы писали:


V>Клиент ждет ответа от сервера, сервер ничего не шлет.

V>Сервер обрывает соединение по таймауту.

V>Вам нужно разбирать http header, что бы понять длину сообщения.


Спасибо, да я попробовал поступить как вы сказали,
действительно 90% случаев это -полторы секунды-
остальные 10% это от 2 сек до 8 сек.
Но фидлер справляется за 0.3 сек почти стабильно,редко погрешность бывает,
первый запрос фиддлер выполняет за 1.3-1.5 сек,но потом 0.3сек стейбл!

в чем-то еще хитрость зарыта

>> через 20 минут


Вроде победил, пока еще не знаю на какие грабли нарвусь,но добился 260ms
пришлось в запрос добавить -> Connection: keep-alive
Отредактировано 19.02.2015 21:34 codenet . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.