【编者按】:网学网ASP.net为您提供Request.Browser.Crawler 属性的工作原理分析参考,解决您在Request.Browser.Crawler 属性的工作原理分析学习中工作中的难题,参考学习。
昨天同事问我如何判断一个请求是否为搜索引擎,我的回答是通过UserAgent字符串自己去判断,而他告诉我.net提供了Crawler属性。我还真没有使用过这个属性,但是我第一反应是微软做的这东西怎么可能把所有搜索引擎都能判断出来呢?这是不可能的阿,至少据我所知网络中还有很多“特殊的搜索引擎”比如说Email的爬虫。我想研究一下什么样特征的搜索引擎能够让Crawler属性为真。
在Web项目中大家都知道有一个Request这个对象,这个对象下面还有一个Browser属性,是描述浏览器的一些属性的类实例,这个Browser下面还有一个布尔值属性Crawler,下面是MSND的解释:
让我们看看它的值是如何得到的,以下代码均通过Reflector查看System.web.dll获得。
public bool Crawler
{
get
{
if (!this._havecrawler)
{
this._crawler = this.CapsParseBool("crawler");
this._havecrawler = true;
}
return this._crawler;
}
}
很明显这里的CapsParseBool("crawler")是关键地方所在,我们继续看这个方法中如何实现的。
private bool CapsParseBool(string capsKey)
{
bool flag;
try
{
flag = bool.Parse(this[capsKey]);
}
catch (FormatException exception)
{
throw this.BuildParseError(exception, capsKey);
}
return flag;
}
我们看到这里就有些明白了,这里的flag就是存储当前请求是否为搜索引擎的变量。而这个值真正存储在this[capsKey]中,我们继续我们的探索。
public virtual string this[string key]
{
get
{
return (string) this._items[key];
}
}
我们又进了一步,真正的值被存储在_items这个集合中,我们来看看它是如何定义的。
private IDictionary _items;
现在我们的问题来了:
这是一个字典接口,它是如何初始化并且得到这个crawler Key/Value键值对的呢?目前我们好像没有什么头绪继续向下查找这个Clawler键对应的值是如何得到的了。
我们回头理一下思路:
Crawler属性是Browser对象的,Browser又是Request类的一个属性。所以初始化Crawler有可能在Browser初始化的时候。Request这个对象是客户端发出请求达到服务器端后,服务器端负责初始化的。Browser对象一定会根据当前请求的Request来初始化自己,所以我们有必要看看Browser这个属性是如何实现的了。
本新闻共6页,当前在第1页 1 2 3 4 5 6