我有以下代码,我将网页下载到字节数组中,然后使用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]);
}
/***************************************************/
然而它不起作用,我得到以下异常:
必须使用适当的property.Parameter name:name
修改此标头有人可以帮我这个吗?使用WebClient添加请求标头的正确方法是什么?
谢谢。
答案 0 :(得分:5)
标题集合“保护”了一些可能的标题,如msdn页面上所述:http://msdn.microsoft.com/en-us/library/system.net.webclient.headers.aspx
该页面似乎提供了您需要的所有答案,但引用了重要部分:
某些常见标头被视为受限制并受到保护 系统,无法在WebHeaderCollection对象中设置或更改。 任何尝试在其中设置其中一个受限制的标头的尝试 与WebClient对象关联的WebHeaderCollection对象将 稍后在尝试发送WebClient时抛出异常 请求。
受系统保护的受限制标头包括但不包括 仅限于以下内容:
Date Host
此外,使用a时,其他一些标题也受到限制 WebClient对象。这些受限制的标题包括但不是 仅限于以下内容:
Accept Connection Content-Length Expect (when the value is set to "100-continue" If-Modified-Since Range Transfer-Encoding
HttpWebRequest类具有用于设置上述某些功能的属性 头。如果应用程序设置这些标头很重要, 那么应该使用HttpWebRequest类而不是WebRequest 类。
我怀疑这样做的原因是许多标题(例如Date和host)必须在不同的请求上设置不同。你不应该复制它们。事实上,我个人可能会建议你不要复制其中任何一个。放入您自己的用户代理 - 如果您获得的页面依赖于某个值,那么我认为您希望确保始终发送有效值而不是依赖原始用户来提供该信息。
基本上找出你需要做的事情,而不是在没有完全理解你在做什么的情况下找到有效的方法。
答案 1 :(得分:1)
看起来您正在尝试设置一些必须使用其中一个WebClient属性设置的标头(CachePolicy
,ContentLength
或ContentType
)
此外,盲目复制所有标题并不是很好,你需要得到你真正需要的标题。