cyc*_*ero 6 c# webclient request-headers
我有以下代码,我将一个网页下载到一个字节数组,然后用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]);
}
/***************************************************/
Run Code Online (Sandbox Code Playgroud)
除了响应头之外,我还需要添加请求头.我尝试使用以下代码:
/*********** Init request headers ********/
NameValueCollection requestHeaders = Request.Headers;
foreach (string key in requestHeaders)
{
client.Headers.Add(key, requestHeaders[key]);
}
/***************************************************/
Run Code Online (Sandbox Code Playgroud)
但它不起作用,我得到以下异常:
必须使用适当的property.Parameter name:name修改此标头
有人可以帮帮我吗?使用WebClient添加请求标头的正确方法是什么?
谢谢.
标题集合"保护"一些可能的标题,如msdn页面上所述:http://msdn.microsoft.com/en-us/library/system.net.webclient.headers.aspx
该页面似乎提供了您需要的所有答案,但引用了重要部分:
某些公共标头被视为受限制并受系统保护,无法在WebHeaderCollection对象中进行设置或更改.在尝试发送WebClient请求时,任何尝试在与WebClient对象关联的WebHeaderCollection对象中设置其中一个受限标头的尝试都将引发异常.
受系统保护的受限标头包括但不限于以下内容:
Run Code Online (Sandbox Code Playgroud)Date Host此外,使用WebClient对象时,某些其他标头也受到限制.这些受限制的标头包括但不限于以下内容:
Run Code Online (Sandbox Code Playgroud)Accept Connection Content-Length Expect (when the value is set to "100-continue" If-Modified-Since Range Transfer-EncodingHttpWebRequest类具有用于设置上述某些标头的属性.如果应用程序设置这些头文件很重要,那么应该使用HttpWebRequest类而不是WebRequest类.
我怀疑其原因是许多标题(例如Date和host)必须在不同的请求上设置不同.你不应该复制它们.事实上,我个人可能会建议你不要复制其中任何一个.放入您自己的用户代理 - 如果您获得的页面依赖于某个值,那么我认为您要确保始终发送有效值而不是依赖原始用户来提供该信息.
基本上可以找出你需要做的事情,而不是在没有完全理解你在做什么的情况下找到有效的方法.
| 归档时间: |
|
| 查看次数: |
19899 次 |
| 最近记录: |