Добавить заголовки запроса с Вебклиента с#

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

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]);
  }
  /***************************************************/

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

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

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

спасибо.

2 ответов


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

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

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

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


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

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