如何判断一个url是否更新了

本文介绍了三种检测网页内容是否发生变化的方法:使用HTTP头信息(eTag和Last-Modified)、使用MD5算法对响应流进行签名以及比较指定范围内的字节内容。重点推荐使用MD5签名方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做这个调研,基本上找到了3种方法:

  1. 使用HttpWebRequest和HttpWebResponse的Headers。

Header中包含两个和Modify相关的key,

    一个是eTag(http://www.baike.com/wiki/Etag),这个是entity id。

     另一个是Lasted-Modified。最后修改时间。

使用这两个header来判断的时候,最好是同时使用,且Etag优先。

  这样做的一个好处是: 如果这个网页只是更新了last-modify的时候,而没有改变内容的情况下,也会返回304.

//响应第一次,获得这两个值:
   HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
   HttpWebResponse res = req.GetResonse() as HttpWebResponse;

   stringeTag= res.Headers[HttpWebResponse.ETag];
   string lastModified = res.Headers[HttpWebResponseHeader.LastModified]

//第二次响应,将上面两个值写入WebRequest的Header传入。
  HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
  req.Methid="GET";
  req.Headers[HttpRequestHeader.IfNoneMatch] = eTag;
  req.IfModifiedSinse = ifModifiedSince;
   HttpWebResponse res = req.GetResonse() as HttpWebResponse;
   //判断response的statusCode
   if(res.StatusCode == HttpStatusCode.NotModified) {}
(注意:)这种方式对于静态页面适用,但是对于动态页面就不适应了。因为动态页面的LastModified时间是服务器发送Response的时间,并非网页的最后更新时间。而Etag通常为空值。
2. 使用给Response的Stream使用MD5(或者SHA1)签名: 最推荐的方法。
对第一次和第二次响应的流分别进行MD5签名,然后进行比较。如果不同则,内容有变。
Md5算法对于文本流的签名很快,M级的数据可在毫秒内完成。
private static string HashData(System.IO.Stream stream, string algName)
        {
            stream.Seek(0, System.IO.SeekOrigin.Begin);
            System.Security.Cryptography.HashAlgorithm algorithm;

            if (algName == null)
            {
                throw new ArgumentNullException("algName 不能为 null");
            } 
            if (string.Compare(algName, "sha1",true) == 0)
            { 
                algorithm = System.Security.Cryptography.SHA1.Create(); 
            }
            else
            {
                if (string.Compare(algName, "md5", true) != 0)
                {
                    throw new Exception("algName 只能使用 sha1 或 md5");
                } 
                algorithm = System.Security.Cryptography.MD5.Create();
            }
          byte[] resultByteAr= algorithm.ComputeHash(stream);
         return BitConverter.ToString(resultByteAr).Replace("-","");
        }

3. 还有一种,但是这种的准确率不很精确: 每次下载一段长度的response的byte,然后呢比较。
这里面主要是使用Range Header来get一段byte[]内容存储,然后第二次的时候,get相同位置的byte[],进行比较。
 

转载于:https://www.cnblogs.com/zhaoyun2007/archive/2012/12/07/2806813.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值