rrr*_*rrr 5 browser asp.net user-agent browser-detection
我目前正在研究浏览器功能,并试图测试.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
Run Code Online (Sandbox Code Playgroud)
通常,这会根据默认浏览器定义文件中的注释中提供的示例提供正确的信息.但是,我不时会看到奇怪的结果,我无法解释.
以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
Run Code Online (Sandbox Code Playgroud)
这应该将浏览器作为Safari返回.这取决于将Safari作为父级的IPhone网关,它与术语相匹配Safari.
稍微更改用户代理以便在iPhone上模拟邮件客户端的用户代理意味着删除用户代理的末尾部分,如下所示:
Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko)
Run Code Online (Sandbox Code Playgroud)
现在应该将Mozilla作为浏览器返回,因为它无法匹配该术语Safari.但是,在第一次报告错误信息后立即对此进行分析,仍然表明浏览器是Safari.
添加自定义.browser文件与App_Browsers文件夹,然后修改它似乎迫使它暂时正确,几乎像定义或规则被缓存,并没有完全运行每个请求.
这也是另一种方式,如果你从第二个示例用户代理开始,那么在分析第一个用户代理时,它将报告为Mozilla而不是Safari.
任何人都可以解释这种行为或解决方法吗?它是否尝试进行某种(不那么)聪明的缓存,它根据类似的用户代理进行假设?
谢谢.
匹配的内容不仅仅是查找字符串“Safari”。如果您查看Mono 的 ASP.Net 实现所使用的用户代理数据库,您将看到第一个更具体的用户代理字符串将匹配其中一个更具体的规则,并且将设置浏览器版本。但即使经过修剪的用户代理字符串仍然符合将其识别为“iPhone”的某种变体的规则,该变体后来显示为“Safari”。
Microsoft 的 ASP.Net 很可能使用非常相似的数据库,我只是使用 Mono 作为示例,因为代码很容易在网络上获得。
所以,我重新审视了我的答案,发现我完全误解了这个问题!你是对的:缓存在这里起作用。.NET Framework 尝试节省解析用户代理字符串的时间。解析 UA 字符串后,结果将保存在哈希表中。关键是 UA 字符串,已被截断。
默认情况下,此密钥长度为 64 个字符,这就是为什么当您更改长 UA 字符串的末尾时,您不会观察到任何变化。UserAgentCacheKeyLength此设置由的属性控制HttpCapabilitiesDefaultProvider。为了验证,我添加了
<browserCaps userAgentCacheKeyLength="512" />
Run Code Online (Sandbox Code Playgroud)
到<system.web>我的测试项目中 Web.config 中的元素。通过这个快速修复,问题就消失了。
| 归档时间: |
|
| 查看次数: |
1225 次 |
| 最近记录: |