加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 为什么我在查看浏览器功能时会得到这些奇怪的结果?

发布时间:2020-12-16 07:44:50 所属栏目:asp.Net 来源:网络整理
导读:我目前正在研究浏览器功能,并试图测试.NET 4.0附带的浏览器定义文件.为此,我使用Firefox的附加组件来更改用户代理,我有一个简单的页面报告以下内容: Request.UserAgentRequest.Browser.IdRequest.Browser.BrowserRequest.Browser.MajorVersionRequest.Brows
我目前正在研究浏览器功能,并试图测试.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作为父级的IPhone网关,它与术语Safari匹配.

稍微更改用户代理以便在iPhone上模拟邮件客户端的用户代理意味着删除用户代理的末尾部分,like Gecko)

现在应该将Mozilla作为浏览器返回,因为它无法在术语Safari上匹配.但是,在第一次报告错误信息后立即对此进行分析,仍然表明浏览器是Safari.

使用App_Browsers文件夹添加自定义.browser文件,然后修改它似乎会强制它暂时正确,几乎就像缓存定义或规则并且不会在每个请求上完全运行.

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

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

谢谢.

解决方法

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

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

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

默认情况下,此密钥长度为64个字符,这就是为什么当您更改长UA字符串的末尾时,您没有观察到任何更改.此设置由HttpCapabilitiesDefaultProvider的属性UserAgentCacheKeyLength控制.为了验证,我补充道

<browserCaps userAgentCacheKeyLength="512" />

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读