Добавить заголовки запроса с помощью WebClient C#

У меня есть следующий код, с помощью которого я загружаю веб-страницу в массив байтов, а затем распечатываю ее с помощью Response.Write:

WebClient client = new WebClient();

byte[] data = client.DownloadData(requestUri);

  /***********        Init response headers    ********/
  WebHeaderCollection responseHeaders = client.ResponseHeaders;
  for (int i = 0; i < responseHeaders.Count; i++)
       {
            Response.Headers.Add(responseHeaders.GetKey(i), responseHeaders[i]);
       }
  /***************************************************/

Помимо заголовков ответов, мне также нужно добавить заголовки запросов. Я пытаюсь сделать это с помощью следующего кода:

  /***********        Init request headers    ********/
  NameValueCollection requestHeaders = Request.Headers;
  foreach (string key in requestHeaders)
  {
      client.Headers.Add(key, requestHeaders[key]);
  }
  /***************************************************/

Однако это не работает, и я получаю следующее исключение:

Этот заголовок должен быть изменен с использованием соответствующего свойства. Имя параметра: имя

Может ли кто-нибудь помочь мне с этим? Каков правильный способ добавления заголовков запросов с помощью WebClient?

Спасибо.


person cycero    schedule 29.09.2011    source источник
comment
То, что ты пытаешься сделать, кажется мне странным. Вам нужно передать некоторые заголовки из запроса страницы в WebClient?   -  person Sergei B.    schedule 29.09.2011
comment
Что я пытаюсь сделать, так это загрузить страницу с помощью WebClient. Чтобы сделать это правильно, мне нужно передать правильные заголовки запроса, такие как User-Agent и т. д. Это должны быть те же заголовки, которые отправляются браузером, когда я загружаю страницу в окне браузера.   -  person cycero    schedule 29.09.2011
comment
Текст исключения: Этот заголовок должен быть изменен с использованием соответствующего свойства. Имя параметра: имя   -  person cycero    schedule 29.09.2011


Ответы (2)


Коллекция заголовков «защищает» некоторые возможные заголовки, как описано на странице msdn здесь: http://msdn.microsoft.com/en-us/library/system.net.webclient.headers.aspx

Эта страница, кажется, дает все ответы, которые вам нужны, но цитирует важную часть:

Некоторые общие заголовки считаются ограниченными и защищены системой, и их нельзя установить или изменить в объекте WebHeaderCollection. Любая попытка установить один из этих ограниченных заголовков в объекте WebHeaderCollection, связанном с объектом WebClient, позже вызовет исключение при попытке отправить запрос WebClient.

Заголовки с ограниченным доступом, защищенные системой, включают, но не ограничиваются следующим:

Date

Host

Кроме того, некоторые другие заголовки также ограничены при использовании объекта WebClient. Эти ограниченные заголовки включают, но не ограничиваются следующим:

Accept

Connection

Content-Length

Expect (when the value is set to "100-continue"

If-Modified-Since

Range

Transfer-Encoding

Класс HttpWebRequest имеет свойства для установки некоторых из вышеперечисленных заголовков. Если для приложения важно установить эти заголовки, то вместо класса WebRequest следует использовать класс HttpWebRequest.

Я подозреваю, что причина этого в том, что многие заголовки, такие как Date и host, должны быть установлены по-разному в другом запросе. Вы не должны копировать их. На самом деле я лично, вероятно, предложил бы вам не копировать ни один из них. Поместите свой собственный пользовательский агент. Если страница, которую вы получаете, зависит от определенного значения, я думаю, вы хотите убедиться, что вы всегда отправляете действительное значение, а не полагаетесь на исходного пользователя, чтобы предоставить вам эту информацию.

По сути делайте то, что вам нужно делать, а не находите что-то, что работает, и делайте это, не полностью понимая, что вы делаете.

person Chris    schedule 29.09.2011
comment
Точно моя проблема. Я должен установить заголовок Accept, вместо этого я сделал это: ((HttpWebRequest) request).Accept = application/json; Я использую WebRequest.Create. - person Lars Udengaard; 03.05.2012
comment
Та же проблема была решена с помощью ((HttpWebRequest)webRequest).UserAgent = Request.UserAgent; Это был прокси - person Morvael; 19.08.2013

Похоже, вы пытаетесь установить некоторый заголовок, который должен быть установлен с использованием одного из свойств WebClient (CachePolicy, ContentLength или ContentType)

Более того, слепо копировать все заголовки не очень хорошо, нужно получить только те, которые действительно нужны.

person Sergei B.    schedule 29.09.2011