Информация об изменениях

Сообщение SslStream Read производительность от 18.02.2015 22:06

Изменено 18.02.2015 22:08 codenet

Доброго времени суток коллеги!

накипел один вопрос:
Есть очень простой пример
        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");
            var ipee = new IPEndPoint(Dns.GetHostAddresses(url.Host).First(), url.Port);
            IPAddress ipAddress = ipee.Address;
            IPEndPoint connectPoint = new IPEndPoint(ipAddress, 443);
            var sb = new StringBuilder();
            sb.AppendLine("GET https://www.okcoin.cn/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 сек ,у меня тоже достаточно быстро все выполняется,
но вешается на чтении последнего пакета,спасибо за советы!
Доброго времени суток коллеги!

накипел один вопрос:
Есть очень простой пример
        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");
            var ipee = new IPEndPoint(Dns.GetHostAddresses(url.Host).First(), url.Port);     
            IPEndPoint connectPoint = new IPEndPoint(ipee.Address, 443);
            var sb = new StringBuilder();
            sb.AppendLine("GET https://www.okcoin.cn/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 сек ,у меня тоже достаточно быстро все выполняется,
но вешается на чтении последнего пакета,спасибо за советы!