Добавьте заголовки запроса с помощью WebClient C # - PullRequest
6 голосов
/ 29 сентября 2011

У меня есть следующий код, с помощью которого я загружаю веб-страницу в байтовый массив, а затем распечатываю ее с помощью 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?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 29 сентября 2011

Коллекция заголовков "защищает" некоторые из возможных заголовков, как описано на странице 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 ихост должен быть установлен по-другому на другой запрос.Вы не должны копировать их.На самом деле, я бы лично предложил вам не копировать ни одну из них.Вставьте свой собственный пользовательский агент - если страница, которую вы получаете, использует определенное значение, то я думаю, вы хотите убедиться, что вы всегда отправляете действительное значение, а не полагаетесь на то, что исходный пользователь предоставит вам эту информацию.

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

1 голос
/ 29 сентября 2011

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

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

...