【问题标题】:.NET Request.Browser incorrectly identifies Opera version.NET Request.Browser 错误识别 Opera 版本
【发布时间】:2013-02-21 16:30:21
【问题描述】:

.Net MVC 3 中的以下代码在应返回“Opera 12”或“Opera 11”时返回“Opera 9”已在多台机器上确认了这一点,Win 7 64 位和 XP 32 位。

public ActionResult TestBrowser()
{
    return Content(Request.Browser.Browser + " " + Request.Browser.MajorVersion);
}

由于某种原因,Opera 的浏览器标签中有一个 9.8,实际版本号在末尾。

是Opera浏览器标签格式错误,还是HttpBrowserCapabilitiesBase类解析错误?

【问题讨论】:

  • 用户代理很容易被欺骗和不准确。也许你应该研究特征检测。但我可以确认它也会为我返回 Opera 9。
  • Request.Browser.MinorVersion 返回的是什么?
  • @DanielHilgarth MinorVersion 返回 80
  • @NeilN:嗯。至少,拥有这样一个拆分版本似乎是一种公认​​的做法。 Firefox 也是如此。 Mozilla/5.0 开头,实际 Firefox 版本结尾。

标签: .net asp.net-mvc browser opera


【解决方案1】:

根据我的经验,正确的版本控制(假设它不是欺骗的用户代理字符串)始终是最后一个斜杠之后显示的版本。所以删除前面的所有内容(包括最后一个斜杠),其余部分将是您当前的版本。

【讨论】:

    【解决方案2】:

    @Sashenka:正如您所指出的,需要 Opera 字符串的硬部分。如果其他浏览器出于类似原因不需要类似的想法,我不会感到惊讶。然而,特征检测只是另一种蠕虫,等待着你在蜂后。例如,IE 的每个版本都改变了它们处理事物的方式;即,您根本无法信任 M$。解析用户代理字符串并不是那么困难,几乎可以保证成功。综上所述,我想知道按照标准编写代码,根据需要包含 IE 绷带,并让每个浏览器按照设计者的意图呈现页面是否更容易;好,坏或无所谓! :-)

    【讨论】:

    • 问题是 Opera 说“Opera/9.80 在用户代理字符串的开头是硬编码的,因为浏览器嗅探脚本将“Opera/10”及更高版本检测为 Opera 1”所以现在我们有修复损坏的依赖项的技巧,这会创建更多损坏的依赖项。现在是一个循环问题:(
    • 我仍然认为特征检测可能比浏览器检测更具前瞻性。如果 MS 使用 IE 或修补程序版本破坏了某些东西,您仍然会检测到相同版本的 IE,但没有您习惯的功能。还有 Modernizr javascript 库 (modernizr.com),它可以帮助您轻松检测访问您网站的浏览器支持的内容。
    【解决方案3】:

    我发现这解释了 Opera 的用户代理字符串以及为什么 Opera/9.80 现在被硬编码在用户代理字符串中。

    http://my.opera.com/community/openweb/idopera/

    就像我在评论中所说的那样,看看特征检测可能会更好,因为您可能很快就会遇到与 IE 10 相同的问题。

    编辑:一种解决方案可能是自己解析用户代理字符串。

    编辑 2:如果您想进行浏览器检测,Modernizr Javascript 库 (http://modernizr.com/) 做得很好。

    【讨论】:

      猜你喜欢
      • 2015-07-04
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 2017-12-01
      • 2013-03-22
      • 1970-01-01
      相关资源
      最近更新 更多