【发布时间】: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