How can I set request headers for an HttpClient (C#) request?

In C#, when you are using HttpClient to make web requests, you can set request headers using the HttpRequestMessage class or by modifying the DefaultRequestHeaders property of the HttpClient instance.

Here's how you can do this in two different ways:

Using DefaultRequestHeaders

This approach is useful when you intend to apply the same headers to multiple requests made by the HttpClient.

using System;
using System.Net.Http;

class Program
{
    static async System.Threading.Tasks.Task Main(string[] args)
    {
        using (var httpClient = new HttpClient())
        {
            // Set default request headers
            httpClient.DefaultRequestHeaders.Add("User-Agent", "My-App");
            httpClient.DefaultRequestHeaders.Add("Accept", "application/json");

            // Make a request
            HttpResponseMessage response = await httpClient.GetAsync("http://example.com/api/data");
            if (response.IsSuccessStatusCode)
            {
                string content = await response.Content.ReadAsStringAsync();
                Console.WriteLine(content);
            }
        }
    }
}

Using HttpRequestMessage

This method allows you to set headers for individual requests, which is useful when headers might differ between requests.

using System;
using System.Net.Http;
using System.Net.Http.Headers;

class Program
{
    static async System.Threading.Tasks.Task Main(string[] args)
    {
        using (var httpClient = new HttpClient())
        {
            using (var request = new HttpRequestMessage())
            {
                // Set the request method and URL
                request.Method = HttpMethod.Get;
                request.RequestUri = new Uri("http://example.com/api/data");

                // Set individual request headers
                request.Headers.Add("User-Agent", "My-App");
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                // Make the request
                HttpResponseMessage response = await httpClient.SendAsync(request);
                if (response.IsSuccessStatusCode)
                {
                    string content = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(content);
                }
            }
        }
    }
}

Setting Custom Headers

For custom headers or headers not directly exposed by the HttpRequestHeaders class, you can still add them using the Add method.

httpClient.DefaultRequestHeaders.Add("X-Custom-Header", "CustomValue");

Or for HttpRequestMessage:

request.Headers.Add("X-Custom-Header", "CustomValue");

Notes

  • Always ensure your headers respect the server's requirements and do not violate any terms of use or privacy policies.
  • Handle HttpRequestException and other exceptions that might be thrown by SendAsync or GetAsync for better error handling.
  • The using statement is employed to ensure that HttpClient and HttpRequestMessage are properly disposed of after their usage, freeing up resources.

Remember that starting with .NET Core 2.1 and above, it's recommended to create a single instance of HttpClient for the lifetime of the application (instead of creating a new instance for each request) to avoid socket exhaustion and other potential side effects of improper HttpClient usage.

Related Questions

Get Started Now

WebScraping.AI provides rotating proxies, Chromium rendering and built-in HTML parser for web scraping
Icon