2015-04-06 82 views
4

我使用WebClient来检索网站。我决定把If-Modified-Since因为如果网站没有改变,我不希望再得到它:无法在WebClient上设置If-Modified-Since?

var c = new WebClient(); 
c.Headers[HttpRequestHeader.IfModifiedSince] = Last_refreshed.ToUniversalTime().ToString("r"); 

Last_refreshed是我存放我最后一次看到网站上的时间的变量。

但是当我运行它,我得到一个WebException与文本:

The 'If-Modified-Since' header must be modified using the appropriate property or method. 
Parameter name: name 

原来,API docs mention this:使用WebClient对象时

此外,还有一些其他的头部也受到限制。这些受限制的接头连接器包括,但不限于以下:

  • 接受
  • 连接
  • 的Content-Length
  • 期望(当此值被设置为 “100-继续”)
  • 如果-Modified-Since的
  • 范围
  • 传输编码

HttpWebRequest类具有设置上述某些标题的属性。如果应用程序设置这些标题很重要,则应该使用HttpWebRequest类而不是WebRequest类。

那么这是否意味着无法将它们设置为WebClient?为什么不?在正常的HTTP GET中指定If-Modified-Since有什么不对?

我知道我可以使用HttpWebRequest,但我不想因为它太多的工作(必须做一堆投射,不能只将内容作为字符串获取)。

此外,我知道Cannot set some HTTP headers when using System.Net.WebRequest是相关的,但它并没有真正回答我的问题。

回答

1

作为笨​​重,因为它可能是,我已选择的子类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; 
    } 
} 

这样做的好处是无需为WebClient提供的标准操作编写样板文件,同时仍然提供了使用WebRequest的一些灵活性。