Sup*_*est 5 c# webclient httpwebrequest if-modified-since
我正在WebClient检索一个网站。我决定进行设置,If-Modified-Since因为如果网站没有更改,我不想再次获得它:
var c = new WebClient();
c.Headers[HttpRequestHeader.IfModifiedSince] = Last_refreshed.ToUniversalTime().ToString("r");
Run Code Online (Sandbox Code Playgroud)
在哪里Last_refreshed存储我上次访问该网站的时间的变量在哪里。
但是当我运行它时,我得到了一个WebException文本:
The 'If-Modified-Since' header must be modified using the appropriate property or method.
Parameter name: name
Run Code Online (Sandbox Code Playgroud)
原来API文档提到了这一点:
此外,使用
WebClient对象时,其他一些标头也受到限制。这些受限制的标头包括但不限于以下内容:
- 接受
- 连接
- 内容长度
- 预期(当值设置为“ 100-continue”时)
- 如果自修改
- 范围
- 传输编码
所述
HttpWebRequest类具有用于设置上述的一些报头的性能。如果对应用程序设置这些标头很重要,HttpWebRequest则应使用WebRequest该类而不是该类。
那么这是否意味着没有办法将它们设置为WebClient?为什么不?指定If-Modified-Since法线有HTTP GET什么问题?
我知道我可以使用HttpWebRequest,但是我不想这样做,因为它工作量太大(必须进行大量的转换,不能仅仅将内容作为字符串来获取)。
另外,我知道使用System.Net.WebRequest时不能设置一些HTTP标头,但实际上并不能回答我的问题。
尽管可能很笨拙,但我选择子类化WebClient,以便以模仿通常工作方式的方式添加功能WebClient(其中标头在每次使用后被消耗/重置):
public class ApiWebClient : WebClient {
public DateTime? IfModifiedSince { get; set; }
protected override WebRequest GetWebRequest(Uri address) {
var webRequest = base.GetWebRequest(address);
var httpWebRequest = webRequest as HttpWebRequest;
if (httpWebRequest != null) {
if (IfModifiedSince != null) {
httpWebRequest.IfModifiedSince = IfModifiedSince.Value;
IfModifiedSince = null;
}
// Handle other headers or properties here
}
return webRequest;
}
}
Run Code Online (Sandbox Code Playgroud)
这样做的优点是不必为 WebClient 提供的标准操作编写样板,同时仍然提供使用 WebRequest 的一些灵活性。
| 归档时间: |
|
| 查看次数: |
1512 次 |
| 最近记录: |