【问题标题】:HttpContext.Request.Browser.Browser detects Edge as ChromeHttpContext.Request.Browser.Browser 将 Edge 检测为 Chrome
【发布时间】:2016-02-13 16:46:09
【问题描述】:

这真的很奇怪,我使用HttpContext.Request.Browser.Browser 属性来检查请求来自哪个浏览器。

使用chrome时,值为Chrome

使用firefox时,值为Firefox

使用Edge时,值为Chrome

这是HttpContext 中的已知错误吗?

检测 IE\Edge 用户最准确的方法是什么?我见过很多检查 user_agent 值的 JS 代码,但它会随着每个 IE 版本而不断变化,所以很难知道哪些代码更新了,哪些没有更新。

也许有人可以推荐一些用于此目的的好的 JS 库?

【问题讨论】:

  • 在用户代理中查找 Edge 关键字,它仅存在于 Edge 浏览器中,而不存在于旧的 Trident 浏览器中
  • 看起来 Edge 返回以下用户代理 Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136 被识别为 Chrome - 所以,是的,这是一个错误。您可以简单地检查用户代理字符串是否包含Edge。但是,为什么需要这个?
  • @Yeldar Kurmangaliyev,我需要在我的站点中阻止 IE\Edge 用户。到目前为止,我已经使用了HttpContext,我知道在服务器端检查它不是最好的主意,但我认为它可能更准确,现在我认为这是不正确的。
  • @LiranBo 哇,这个网站似乎是一个浏览器种族主义者:) 如果你不介意,你能描述一下这个决定的最初原因吗?也许,我们可以找到另一个解决方案。
  • @Yeldar Kurmangaliyev :),他们是邪恶的 :) ,nha 我在我的网站上使用拖放,这在 IE\Edge 中不受支持。我的网站是为在 Mturk 上进行测试而构建的,所以我并不担心会失去一些用户

标签: javascript asp.net-mvc internet-explorer httpcontext browser-detection


【解决方案1】:

如果你不介意使用 JS,你可以这样做:

function get_browser() {
            var ua = navigator.userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident|edge(?=\/))\/?\s*(\d+)/i) || [];
            if (/trident/i.test(M[1])) {
                tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
                return { name: 'IE', version: (tem[1] || '') };
            }
            if (M[1] === 'Chrome') {
                tem = ua.match(/\bOPR\/(\d+)/);
                if (tem != null) { return { name: 'Opera', version: tem[1] }; }
                tem = ua.match(/\bEdge\/(\d+)/);
                if (tem != null) { return { name: 'Edge', version: tem[1] }; }
            }
            M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
            if ((tem = ua.match(/version\/(\d+)/i)) != null) { M.splice(1, 1, tem[1]); }
            return {
                name: M[0],
                version: M[1]
            };
        }

然后您可以简单地调用它并将结果发送到您的后端。它对我来说就像一种魅力。

【讨论】:

    【解决方案2】:

    这个方法对我来说很好用

    if (Regex.IsMatch(HttpContext.Request.UserAgent, @"Edge\/\d+"))
     {
        wrkBrowser = "Edge"
      }
    

    如果您要检查多个浏览器,请注意检查的顺序,因为许多浏览器喜欢在其 UserAgent 字符串中提及其他浏览器。 那时还要检查以下条件

     Request.Browser.Browser == "Chrome" 
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,我找出了它的根本原因,也能够解决它。

      解决方法是在Web.config中增加userAgentCacheKeyLength,如下:

      <system.web>
          <browserCaps userAgentCacheKeyLength="256" />
      </system.web>
      

      userAgentCacheKeyLength 的默认值为 64。

      发生的情况是 IIS 将用户代理值缓存到userAgentCacheKeyLength 中定义的长度(默认为 64)。因此,如果您使用 Chrome 访问第一个请求,IIS 会将 Chrome 的用户代理值的前 64 个字符存储在缓存中。现在,如果您下次从 Edge 发出请求,IIS 会匹配前 64 个字符,这与 Chrome 的类似,因此 IIS 将浏览器值返回为 Chrome。

      如果将值增加到 256,IIS 将能够存储用户代理的全部值,因此它将始终准确地区分 Chrome 和 Edge 浏览器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-30
        • 1970-01-01
        • 2020-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多