我不能在WebClient上设置If-Modified-Since吗?

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标头,但实际上并不能回答我的问题。

Tho*_*ias 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

这样做的优点是不必为 WebClient 提供的标准操作编写样板,同时仍然提供使用 WebRequest 的一些灵活性。