Try it yourself with our free Curl Converter tool — runs entirely in your browser, no signup needed.

How to Make HTTP requests in C#

How to make HTTP requests in C#

Making HTTP requests is a crucial aspect of modern web development, allowing your application to interact with web servers, APIs, and microservices. In C#, the HttpClient class provides a flexible and efficient way to send HTTP requests and receive responses. In this guide, we'll explore how to make HTTP requests in C#, covering the basics, handling edge cases, common mistakes, and performance tips.

Quick Example

using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        using var httpClient = new HttpClient();
        var response = await httpClient.GetAsync("https://example.com");
        response.EnsureSuccessStatusCode();
        var responseBody = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseBody);
    }
}

This example demonstrates a simple GET request to a URL using the HttpClient class.

Step-by-Step Breakdown

1. Importing the necessary namespace

using System.Net.Http;

We import the System.Net.Http namespace, which contains the HttpClient class.

2. Creating an instance of HttpClient

using var httpClient = new HttpClient();

We create a new instance of HttpClient using the using statement, which ensures the object is properly disposed of when we're done with it.

3. Sending the HTTP request

var response = await httpClient.GetAsync("https://example.com");

We use the GetAsync method to send a GET request to the specified URL. The await keyword is used to asynchronously wait for the response.

4. Checking the response status code

response.EnsureSuccessStatusCode();

We use the EnsureSuccessStatusCode method to throw an exception if the response status code is not successful (200-299).

5. Reading the response body

var responseBody = await response.Content.ReadAsStringAsync();

We use the ReadAsStringAsync method to read the response body as a string.

Handling Edge Cases

Empty/Null Input

if (string.IsNullOrEmpty(url))
{
    throw new ArgumentException("URL cannot be null or empty", nameof(url));
}

We check if the input URL is null or empty and throw an exception if it is.

Invalid Input

try
{
    var response = await httpClient.GetAsync(url);
    // ...
}
catch (HttpRequestException ex)
{
    Console.WriteLine($"Invalid URL: {ex.Message}");
}

We catch the HttpRequestException that is thrown when the input URL is invalid.

Large Input

httpClient.Timeout = TimeSpan.FromSeconds(30); // Increase the timeout for large inputs

We increase the timeout for large inputs to prevent timeouts.

Unicode/Special Characters

var url = "https://example.com/" + Uri.EscapeDataString(" path with special chars");

We use the Uri.EscapeDataString method to escape special characters in the URL.

Common Mistakes

1. Not disposing of HttpClient

// Wrong
var httpClient = new HttpClient();
// ...

// Correct
using var httpClient = new HttpClient();

Failing to dispose of HttpClient can lead to socket exhaustion.

2. Not checking the response status code

// Wrong
var response = await httpClient.GetAsync(url);

// Correct
var response = await httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();

Not checking the response status code can lead to unexpected behavior.

3. Not handling exceptions

// Wrong
var response = await httpClient.GetAsync(url);

// Correct
try
{
    var response = await httpClient.GetAsync(url);
    // ...
}
catch (HttpRequestException ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}

Not handling exceptions can lead to crashes and unexpected behavior.

Performance Tips

1. Use a single instance of HttpClient

private static readonly HttpClient httpClient = new HttpClient();

Reusing a single instance of HttpClient can improve performance by reducing the number of socket connections.

2. Use the Timeout property

httpClient.Timeout = TimeSpan.FromSeconds(30);

Setting the Timeout property can prevent timeouts and improve performance.

3. Use SendAsync instead of GetAsync

var request = new HttpRequestMessage(HttpMethod.Get, url);
var response = await httpClient.SendAsync(request);

Using SendAsync instead of GetAsync can provide more flexibility and improve performance.

FAQ

Q: What is the difference between HttpClient and WebRequest?

A: HttpClient is a more modern and flexible way of making HTTP requests, while WebRequest is an older API that is still supported for backwards compatibility.

Q: How do I handle cookies with HttpClient?

A: You can use the CookieContainer class to handle cookies with HttpClient.

Q: Can I use HttpClient with .NET Core?

A: Yes, HttpClient is fully supported in .NET Core.

Q: How do I cancel an ongoing HTTP request?

A: You can use the CancellationToken class to cancel an ongoing HTTP request.

Q: What is the default timeout for HttpClient?

A: The default timeout for HttpClient is 100 seconds.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp