Exemplo n.º 1
0
        /// <summary>
        /// InvokeAsync
        /// </summary>
        /// <param name="context">context</param>
        /// <returns>Task</returns>
        public async Task InvokeAsync(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync().ConfigureAwait(false);

                var multiplexedWebSocket = new MultiplexedWebSocket(webSocket);
                await multiplexedWebSocket.Completion.ConfigureAwait(false);
            }
            else
            {
                await _next(context).ConfigureAwait(false);
            }
        }
Exemplo n.º 2
0
        static async Task Main(string[] args)
        {
            var cts     = new CancellationTokenSource();
            var webHost = WebHost.CreateDefaultBuilder(args)
                          .ConfigureKestrel(kestrelServerOptions =>
            {
                kestrelServerOptions.Listen(IPAddress.Any, 5001, listenOptions =>
                {
                    listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
                    listenOptions.UseHttps();
                });
            })
                          .Configure(app =>
            {
                app.Map("/ws", HandleMultiplexedWebSocket);
                app.Map("/client", HandleHttpClient);
            })
                          .ConfigureLogging(builder =>
            {
                builder.ClearProviders();
                builder.SetMinimumLevel(LogLevel.Error);
            })
                          .Build();

            var runTask = webHost.RunAsync(cts.Token);

            using (var clientWebSocket = new ClientWebSocket())
                using (var httpClient = new HttpClient(new WinHttpHandler(), true))
                {
                    httpClient.BaseAddress = new Uri(_httpClientUrl);
                    await clientWebSocket.ConnectAsync(new Uri(_clientWebSocketUrl), cts.Token).ConfigureAwait(false);

                    var mx   = new MultiplexedWebSocket(clientWebSocket);
                    var data = new ReadOnlySequence <byte>(new byte[] { 1, 2, 3, 4, 5 });
                    foreach (Benchmark benchmark in Enum.GetValues(typeof(Benchmark)))
                    {
                        if (benchmark == Benchmark.HttpClient)
                        {
                            var response = await httpClient.SendAsync(new HttpRequestMessage()
                            {
                                Method = HttpMethod.Get, Version = HttpVersion.Version20
                            });

                            if (response.Version != HttpVersion.Version20)
                            {
                                throw new InvalidOperationException("Should be Http/2");
                            }
                        }

                        var watch = Stopwatch.StartNew();
                        for (int i = 0; i < _times; i++)
                        {
                            var tasks = new List <Task>(_batch);
                            for (int b = 0; b < _batch; b++)
                            {
                                switch (benchmark)
                                {
                                case Benchmark.MultiplexedWebSocket:
                                    tasks.Add(mx.RequestResponseAsync(data, cts.Token));
                                    break;

                                case Benchmark.HttpClient:
                                    tasks.Add(httpClient.SendAsync(new HttpRequestMessage()
                                    {
                                        Method = HttpMethod.Get, Version = HttpVersion.Version20
                                    }));
                                    break;
                                }
                            }

                            await Task.WhenAll(tasks).ConfigureAwait(false);
                        }

                        watch.Stop();
                        Console.WriteLine($"{benchmark}: {(_times * _batch) / watch.Elapsed.TotalSeconds:N0} per second");
                    }
                }
            cts.Cancel();
            await runTask.ConfigureAwait(false);

            await webHost.StopAsync().ConfigureAwait(false);

            Console.ReadKey(true);
        }