我会和HttpWebRequst
因为它没有那么抽象,可以让你大量摆弄 HTTP 参数。例如,如果服务器返回“文件未更改”,您可以选择不下载整个页面。
如果您向请求添加一些参数,例如IfModifiedSince http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.ifmodifiedsince.aspx(可能是 HEAD 或 GET 请求)服务器可能会返回响应代码304 - 未修改。参考HTTP中缓存的描述 http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html以获得进一步的解释。
关键是要确保您只下载自上次获取以来实际修改过的完整页面。大多数时候它不会被改变(我想,如果不知道你的域名就无法确定),所以你只需要从服务器得到一个轻量级的响应,它简单地说明“这里没有任何改变”。
Update:演示使用的代码示例IfModifiedSince
财产:
bool IsResourceModified(string url, DateTime dateTime) {
try {
var request = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));
request.IfModifiedSince = dateTime;
request.Method = "HEAD";
var response = (HttpWebResponse)request.GetResponse();
return true;
}
catch(WebException ex) {
if(ex.Status != WebExceptionStatus.ProtocolError)
throw;
var response = (HttpWebResponse)ex.Response;
if(response.StatusCode != HttpStatusCode.NotModified)
throw;
return false;
}
}
这个方法应该返回true
如果该页面自dateTime
日期和false
如果不是的话。GetResponse
方法会抛出一个WebException http://msdn.microsoft.com/en-us/library/system.net.webexception.aspx如果你发出 HEAD 请求并且服务器返回304 - 未修改(这有点不幸)。我们必须确保这不是其他 Web 连接问题,这就是为什么我检查 Web 异常状态和响应中的 HTTP 状态。如果有其他原因导致异常,我们只需将其进一步抛出即可。
Console.WriteLine(IsResourceModified("http://example.com", new DateTime(2009)));
Console.WriteLine(IsResourceModified("http://example.com", DateTime.Now));
此示例代码产生输出:
True
False
Note:请务必阅读吉姆·米歇尔对此答案的补充 https://stackoverflow.com/a/6253972/501518因为他对这项技术几乎没有给出什么好的建议。