2011-11-17 31 views
5

目前我正在为浏览器的功能,我试图测试浏览器定义文件来与.NET 4.0。要做到这一点,我在附加使用的Firefox来改变用户代理,我有一个简单的网页,其中以下报道:为什么在浏览器功能中看到这些奇怪的结果?

Request.UserAgent 
Request.Browser.Id 
Request.Browser.Browser 
Request.Browser.MajorVersion 
Request.Browser.MinorVersion 
Request.Browser.Platform 
Request.Browser.IsMobileDevice 
Request.Browser.MobileDeviceManufacturer 
Request.Browser.MobileDeviceModel 

一般来说,这给出了基于在评论中提供的例子正确的信息在默认的浏览器定义文件中。然而,我不时看到奇怪的结果,我无法解释。

拿在iphone.browser定义文件,该文件是如下的例子iPhone用户代理:

Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3 

这应该返回浏览器如Safari,这确实。这是下降到有Safari浏览器作为一个父亲,这对术语Safari匹配的IPhone网关。

改变用户代理略有所以它模拟了邮件客户端上的iPhone用户代理是指去除用户代理的端部,如下所示:

Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) 

现在,这应该返回的Mozilla的浏览器,因为它将无法匹配术语Safari。但是,在第一次报告返回不正确的信息之后立即分析这一点,并且仍然指示浏览器为Safari。

添加自定义.browser文件与App_Browsers文件夹,然后修改,似乎迫使它是正确的暂时,几乎像定义或规则被缓存,并在每次请求没有完全运行。

这工作的其他方式也一样,如果你的第二个例子用户代理上启动,然后在分析第一个将作为Mozilla浏览器Safari浏览器,而不是报告。

任何人都可以解释这种现象或解决它的方法吗?它是否试图做某种(不那么)聪明的缓存,它根据类似的用户代理进行假设?

谢谢。

回答

1

还有更多的比赛不仅仅是寻找字符串“野生动物园”。如果你看一下通过Mono的ASP.Net实现中使用的user agent database,你会看到你的第一个更具体的用户代理字符串匹配的更具体的规则之一,而浏览器的版本将被设置。但即使是修剪过的用户代理字符串仍然遇到了一个规则,将其标识为“iPhone”的一些变体,后者以“Safari”的形式出现。

微软的ASP.Net最有可能使用一个非常相似的数据库,我只是用Mono作为例子,因为代码在网上很容易找到。


所以,我重新回到我的答案,并意识到我完全曲解了这个问题!你是对的:高速缓存在这里起作用。 .NET Framework试图节省解析用户代理字符串的时间。一旦分析了UA字符串,结果就会保存在散列表中。关键是UA字符串,被截断。

默认情况下,该密钥长度为64个字符,这就是为什么当您更改长UA字符串的结尾时,您会发现没有更改。此设置受HttpCapabilitiesDefaultProvider的属性UserAgentCacheKeyLength的控制。为了验证,我加

<browserCaps userAgentCacheKeyLength="512" /> 

在Web.config中<system.web>元素在我的测试项目。有了这个快速解决方案,问题就消失了。

+0

如果你说的是正确的,那么结果将是一致的,无论哪个用户代理将首先分析,但这不是因为在我的例子描述的情况。您可以看到自己的规则,它们与Windows中的相关Framework文件夹一起存储在“Config/Browsers”中。至于你的评论“比赛只有寻找字符串'Safari'还有更多。”这正是它匹配作为可在'safari.browser'文件,你会看到它从Mozilla的继承中可以看出,简单地使用它扩展'<的userAgent匹配=“野生动物园” />' – rrrr

+0

只注意到这个编辑当有人投了这个问题时,我会在有空的时候再进一步调查。 – rrrr

相关问题