WebRequest“HEAD”轻量级替代品

我最近发现以下内容不适用于某些网站,例如IMDB.com。

class Program { static void Main(string[] args) { try { System.Net.WebRequest wc = System.Net.WebRequest.Create("http://www.imdb.com"); //args[0]); ((HttpWebRequest)wc).UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.153.1 Safari/525.19"; wc.Timeout = 1000; wc.Method = "HEAD"; WebResponse res = wc.GetResponse(); var streamReader = new System.IO.StreamReader(res.GetResponseStream()); Console.WriteLine(streamReader.ReadToEnd()); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } 

它返回HTTP 405(Method Not Allowed)。 我的问题是,我使用与上面非常类似的代码来检查链接是否有效以及绝大多数时候它是否正常工作。 我可以将它切换到等于GET的方法并且它可以工作(增加超时),但这会使事情减慢一个数量级。 我假设405响应是IMDB服务器端的服务器配置。

有没有办法让我在.NET中以轻量级的方式做同样的事情? 或者,有没有办法修复上面的代码,所以它作为一个与imdb一起使用的GET请求?

你必须澄清“轻量级”的含义。 你想达到什么目的?

是否可以使用GET / POST / HEAD / DELETE / etc将取决于URL以及在该URL上的服务器上运行的应用程序中配置的内容。

如果你要做的就是看看你是否可以在没有实际下载内容的情况下建立连接,你可以尝试使用套接字启动到端口80的连接 ,但是通过更改不能实现可靠或普遍支持的方式HTTP方法。

使用套接字(而不是HttpRequest或WebClient ) 自行打开连接,并在读取状态代码后立即关闭流。 幸运的是,状态代码接近响应流的顶部:)

如果HEAD返回405,这意味着服务器不支持HEAD(至少对于该URL),而你将退回到GET。 大多数站点应该支持HEAD,因此您可能希望默认情况下执行HEAD,但如果它抛出405,您可能会回退到该域的GET。 或许你想先为每个请求尝试HEAD; 因人而异。

如果服务器需要GET并且您想减少网络流量,您可以尝试进行条件GET和/或部分GET(参见例如RFC2616 )。 我从来没有尝试过使用WebRequest,但我认为它可以让你添加自定义的传出HTTP标头,所以你应该能够做到这一点。

另外,不要忘记,如果你正在编写一个蜘蛛(你显然是这样),你应该尊重服务器的robots.txt,而且你也要礼貌地将你的请求限制为每两秒一次请求,所以你不要斜线服务器。