Cannot set some HTTP headers when using System.Net.WebRequest

c#, header, webrequest

Solution

If you need the short and technical answer go right to the last section of the answer.

If you want to know better, read it all, and i hope you'll enjoy...

I countered this problem too today, and what i discovered today is that:

the above answers are true, as:

1.1 it's telling you that the header you are trying to add already exist and you should then modify its value using the appropriate property (the indexer, for instance), instead of trying to add it again.

1.2 Anytime you're changing the headers of an `HttpWebRequest`, you need to use the appropriate properties on the object itself, if they exist.

Thanks FOR and Jvenema for the leading guidelines...

But, What i found out, and that was the missing piece in the puzzle is that:

2.1 The `WebHeaderCollection` class is generally accessed through `WebRequest`.Headers or `WebResponse`.Headers. Some common headers are considered restricted and are either exposed directly by the API (such as Content-Type) or protected by the system and cannot be changed.

The restricted headers are:

- `Accept`

- `Connection`

- `Content-Length`

- `Content-Type`

- `Date`

- `Expect`

- `Host`

- `If-Modified-Since`

- `Range`

- `Referer`

- `Transfer-Encoding`

- `User-Agent`

- `Proxy-Connection`

So, next time you are facing this exception and don't know how to solve this, remember that there are some restricted headers, and the solution is to modify their values using the appropriate property explicitly from the `WebRequest`/`HttpWebRequest` class.

Edit: (useful, from comments, comment by user Kaido)

Solution is to check if the header exists already or is restricted (`WebHeaderCollection.IsRestricted(key)`) before calling add

Problem

When I try to add a HTTP header key/value pair on a `WebRequest` object, I get the following exception: This header must be modified using the appropriate property I've tried adding new values to the `Headers` collection by using the Add() method but I still get the same exception. ``` webRequest.Headers.Add(HttpRequestHeader.Referer, "http://stackoverflow.com"); ``` I can get around this by casting the WebRequest object to a HttpWebRequest and setting the properties such as `httpWebReq.Referer ="http://stackoverflow.com"`, but this only works for a handful of headers that are exposed via properties. I'd like to know if there's a way to get a finer grained control over modifying headers with a request for a remote resource.

Original source