Program throws SocketException when trying to send hundreds of http requests simultaneously

Viewed 1662

I have written an API endpoint and created a simple .net core console app to send off multiple requests to the API endpoint simultaneously to test how the API endpoint works

The code looks as below

    static async Task Main(string[] args)
    {

        // ARRANGE

        int request_number = 200;
        Task<HttpResponseMessage>[] tasks = new Task<HttpResponseMessage>[request_number];
        Action[] actions = new Action[request_number];

        for (int i = 0; i < request_number; i++)
        {
            int temp = i;
            actions[temp] = () =>
            {
                tasks[temp] = CallMyAPI();
            };
        }


        // ACT
        Parallel.Invoke(actions);
        await Task.WhenAll(tasks);


        // ASSERT
        string sample1 = await tasks[0].Content.ReadAsStringAsync();
        for (int i = 1; i < request_number; i++)
        {
            string toBeTested = await tasks[i].Content.ReadAsStringAsync();
            if (toBeTested != sample1)
            {
                Console.WriteLine("Wrong! i = " + i);
            }
        }

        Console.WriteLine("finished");

        Console.WriteLine("Press any key to complete...");
        Console.Read();
    }

    static async Task<HttpResponseMessage> CallMyAPI()
    {


        var request = new HttpRequestMessage();
        request.Method = HttpMethod.Post;

        string contentString = "some json string as http body";
        request.Content = new StringContent(contentString, System.Text.Encoding.UTF8, "application/json");

        request.RequestUri = new Uri("http://myAPIendpoint.com");

        HttpResponseMessage response;
        using (HttpClient httpClient = new HttpClient())
        {
            response = await httpClient.SendAsync(request);
        }

        return response;
    }

So basically what I have been trying to do by the code is to send off multiple requests once, and wait and record all the responses. Then I compare them to verify that they all return the same response.

Initially, when I set the variable request_number as small numbers, like 50, 100, the test app runs well. However, as the request_numbergoes up and reaches around 200, it starts to throw an exception that looks like:

Inner Exception 1: IOException: Unable to read data from the transport connection: The I/O operation has been aborted because of either a thread exit or an application request.

Inner Exception 2: SocketException: The I/O operation has been aborted because of either a thread exit or an application request

What is this kind of exception supposed to mean?

1 Answers

Your problem is this:

 using (HttpClient httpClient = new HttpClient())
        {..
}

Each of these uses a new socket. Use a single httpclient, e.g. a static one

Related