进展:可以获得文件流了。而且根据测试,这个 URL 有相当长的保质期(真的是8小时吗?还没测试过),至少用 Fiddler Composer 测试的时候历史记录还能派上用场。
要点:
经过两次跳转。第一次:d.pcs.baidu.com
->xxx.yyy.baidupcs.com
;第二次:xxx.yyy.baidupcs.com
->xxx.yyy.baidupcs.com
,查询参数(query arguments)不同。两次都是302跳转。
由于浏览器中只见到一个302和一个200,所以我以为只有一次跳转。第二次我就忙不迭去查看 Content-Disposition
去了。但是,获得的是403、505和少量的 null
,Content-Type
是 text/html
。通过查看记录,仅有的成功实例也是302。但是,当我重复请求(将历史项直接拖到 Composer 里执行)时却能得到200。开始我百思不得其解,将成功和失败的请求头复制到 Notepad++ 里交换看,终于看出请求的URL是不同的……于是我领悟到原来第二次还是302,要再手工跳转一次。果然,在第二次跳转后,得到了文件流。
我在建这个博客的时候看到过一篇文章,有人问 GitHub 博客下的 CNAME 记录是怎么工作的(例如,本博客到 http://gridscience.github.io/),这些请求似乎都到了每个 CDN 服务器上(一些固定的 IP),这些服务器是怎么识别应该访问什么网站的?当时有人给出了解答,说是看请求头里的 Host
字段。我想着,既然本地 DNS 缓存将所有的域都解析到了同一个 IPv6 地址,对方很可能也是通过 Host
来识别的吧!
试验的结果是,不管是 HttpWebRequest
还是 Fiddler,都不把手工设置的 Host
当回事……而且,对方也并未区分请求哪个 CDN,直接使用 IPv6 地址、自动设置的 Host
就可以了。