5

我正在使用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 文档提到了这一点

此外,在使用WebClient对象时,其他一些标头也受到限制。这些受限标头包括但不限于以下内容:

  • 接受
  • 联系
  • 内容长度
  • 期望(当值设置为“100-继续”时)
  • If-Modified-Since
  • 范围
  • 传输编码

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

那么这是否意味着无法设置它们WebClient?为什么不?If-Modified-Since在 normal中指定有什么问题HTTP GET

我知道我可以只使用HttpWebRequest,但我不想这样做,因为它的工作量太大(必须做一堆转换,不能只是将内容作为字符串获取)。

另外,我知道使用 System.Net.WebRequest 时无法设置一些 HTTP 标头是相关的,但它实际上并没有回答我的问题。

4

1 回答 1

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 的一些灵活性。

于 2016-04-25T21:11:20.793 回答