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