【问题标题】:Why am I getting these strange results when looking at browser capabilities?为什么在查看浏览器功能时会得到这些奇怪的结果?
【发布时间】:2011-12-31 07:01:39
【问题描述】:

我目前正在研究浏览器功能并尝试测试 .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

通常,这会根据默认浏览器定义文件中的 cmets 中提供的示例提供正确的信息。然而,我不时看到奇怪的结果,我无法完全解释。

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 为父级的 iPhone 网关,它与术语 Safari 匹配。

稍微改变用户代理,使其模拟 iPhone 上邮件客户端的用户代理,这意味着删除用户代理的结尾部分,如下所示:

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

这现在应该返回 Mozilla 作为浏览器,因为它将无法匹配术语 Safari。但是,在第一次返回错误信息后立即分析,仍然指示浏览器是Safari。

添加带有App_Browsers 文件夹的自定义.browser 文件,然后对其进行修改似乎强制它暂时正确,几乎就像定义或规则被缓存并且未在每个请求上完全运行一样。

这也适用于另一种方式,如果您从第二个示例用户代理开始,那么在分析第一个示例后,它将报告为 Mozilla 而不是 Safari。

谁能解释这种行为或解决方法?它是否试图做某种(不是那么)聪明的缓存,它基于类似的用户代理做出假设?

谢谢。

【问题讨论】:

    标签: asp.net browser browser-detection user-agent


    【解决方案1】:

    除了查找字符串“Safari”之外,还有更多的匹配项。如果您查看 Mono 的 ASP.Net 实现使用的user agent database,您会看到您的第一个更具体的用户代理字符串将匹配一个更具体的规则,并且将设置浏览器版本。但即使是修剪后的用户代理字符串仍然符合将其标识为“iPhone”的某种变体的规则,该变体后来显示为“Safari”。

    Microsoft 的 ASP.Net 很可能使用了一个非常相似的数据库,我只是使用 Mono 作为示例,因为代码在网络上很容易获得。


    所以,我重新审视了我的答案,并意识到我完全误解了这个问题!你是对的:缓存在这里起作用。 .NET Framework 尝试节省解析用户代理字符串的时间。解析 UA 字符串后,结果将保存在哈希表中。关键是截断的 UA 字符串。

    默认情况下,此密钥长度为 64 个字符,这就是为什么当您更改长 UA 字符串的结尾时您观察不到任何变化的原因。此设置由HttpCapabilitiesDefaultProvider 的属性UserAgentCacheKeyLength 控制。为了验证,我添加了

    <browserCaps userAgentCacheKeyLength="512" />
    

    到我的测试项目中 Web.config 中的 &lt;system.web&gt; 元素。有了这个快速修复,问题就消失了。

    【讨论】:

    • 如果您所说的是正确的,那么无论首先解析哪个用户代理,结果都将是一致的,但这不是我的示例中概述的情况。您可以自己查看规则,它们与 Windows 中的相关 Framework 文件夹一起存储在 Config/Browsers 中。至于您的评论“比赛不仅仅是寻找字符串'Safari'。”这正是它匹配的内容,可以在 safari.browser 文件中看到,您将在该文件中看到它继承自 Mozilla 并使用 &lt;userAgent match="Safari" /&gt; 简单地扩展它
    • 刚刚注意到这个问题的编辑,因为有人对这个问题投了赞成票,我会在有时间的时候重新审视这个问题并进一步调查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 2020-12-27
    • 2020-07-08
    • 2018-03-03
    • 1970-01-01
    • 2019-12-11
    相关资源
    最近更新 更多