Exemple #1
0
        public async Task MultiplexGet(string scheme)
        {
            var requestsReceived    = 0;
            var requestCount        = 10;
            var allRequestsReceived = new TaskCompletionSource <int>(TaskCreationOptions.RunContinuationsAsynchronously);
            var hostBuilder         = new HostBuilder()
                                      .ConfigureWebHost(webHostBuilder =>
            {
                ConfigureKestrel(webHostBuilder, scheme);
                webHostBuilder.ConfigureServices(AddTestLogging)
                .Configure(app => app.Run(async context =>
                {
                    if (Interlocked.Increment(ref requestsReceived) == requestCount)
                    {
                        allRequestsReceived.SetResult(0);
                    }
                    await allRequestsReceived.Task;
                    var content = new BulkContent();
                    await content.CopyToAsync(context.Response.Body).DefaultTimeout();
                }));
            });

            using var host = await hostBuilder.StartAsync().DefaultTimeout();

            var url = host.MakeUrl(scheme);

            using var client = CreateClient();

            var requestTasks = new List <Task>(requestCount);

            for (var i = 0; i < requestCount; i++)
            {
                requestTasks.Add(RunRequest(url));
            }

            async Task RunRequest(string url)
            {
                using var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead).DefaultTimeout();

                Assert.Equal(HttpVersion.Version20, response.Version);
                await BulkContent.VerifyContent(await response.Content.ReadAsStreamAsync()).DefaultTimeout();
            };

            await Task.WhenAll(requestTasks);

            await host.StopAsync().DefaultTimeout();
        }