服务器端的Internet Explorer 11检测如何实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (108)

我们都知道IE11检测不适用于服务器端语言,因为微软已经删除了IE / MSIE浏览器指示,现在完全是“Mozilla”。

我也知道做浏览器检测/版本是有风险的,但在过去已经为我们提供了很好的服务。

网站的一些要求是这样的:

必须使用某些版本的Firefox和以上必须与某些版本的铬和以上必须与Safari浏览器的某些版本(一些下面和一些更新)必须与IE> = 8

所以这里是问题... IE11在我的列表中指出它不被支持。我想从服务器上的事物的网络端支持它(ASP.NET / MVC)

目前还不清楚如何从服务器端检测到这一点。有谁知道如何?

这是IE 11中显示的用户代理:

“像Gecko一样的Mozilla / 5.0(Windows NT 6.1; WOW64; Trident / 7.0; rv:11.0)”

rv:11.0告诉我们它的IE11对此进行了解析,这仍然意味着,例如,它可能是某种版本的Chrome,在这样的需求中甚至不支持firefox。

那么,看看它是否确实是IE 11或更高版本,最好的方法是什么?

我不太确定从“Trident”开始搜索,因为我不知道其他浏览器是否使用它。

提问于
用户回答回答于

为了保持与现有代码的兼容性,我创建了一个自定义提供程序,以便Request.Browser按预期返回信息。例如,Browser.Browser将“IE”而不是“InternetExplorer”,这是安装此修复程序后的新值。

此外,此方法在兼容性视图中返回实际版本的IE,而不是版本7。请注意,Browser.Type如果您需要检测它,将在兼容性视图中返回“IE7”,或者您可以轻松修改自定义提供程序以更改.Type。

该方法很简单。从类中派生一个类HttpCapabilitiesDefaultProvider并将其设置BrowserCapabilitiesProvider为您的类的一个实例。

在Global.asax.cs中:

protected void Application_Start(Object sender, EventArgs e)
{
    ...
    HttpCapabilitiesBase.BrowserCapabilitiesProvider = new CustomerHttpCapabilitiesProvider();
    ...
}

定义类:已更新为包含MICROSOFT EDGE BROWSER

public class CustomerHttpCapabilitiesProvider : HttpCapabilitiesDefaultProvider
{
    public override HttpBrowserCapabilities GetBrowserCapabilities(HttpRequest request)
    {
        HttpBrowserCapabilities browser = base.GetBrowserCapabilities(request);

        // Correct for IE 11, which presents itself as Mozilla version 0.0
        string ua = request.UserAgent;

        // Ensure IE by checking for Trident
        // Reports the real IE version, not the compatibility view version. 
        if (!string.IsNullOrEmpty(ua))
        {
            if (ua.Contains(@"Trident"))
            {
                if (!browser.IsBrowser(@"IE"))
                {
                    browser.AddBrowser(@"ie");
                    browser.AddBrowser(@"ie6plus");
                    browser.AddBrowser(@"ie10plus");
                }

                IDictionary caps = browser.Capabilities;
                caps[@"Browser"] = @"IE";

                // Determine browser version
                bool ok = false;
                string majorVersion = null; // convertable to int
                string minorVersion = null; // convertable to double
                Match m = Regex.Match(ua, @"rv:(\d+)\.(\d+)");
                if (m.Success)
                {
                    ok = true;
                    majorVersion = m.Groups[1].Value;
                    minorVersion = m.Groups[2].Value; // typically 0
                }
                else
                {
                    m = Regex.Match(ua, @"Trident/(\d+)\.(\d+)");
                    if (m.Success)
                    {
                        int v;
                        ok = int.TryParse(m.Groups[1].Value, out v);
                        if (ok)
                        {
                            v += 4; // Trident/7 = IE 11, Trident/6 = IE 10, Trident/5 = IE 9, and Trident/4 = IE 8
                            majorVersion = v.ToString(@"d");
                            minorVersion = m.Groups[2].Value; // typically 0
                        }
                    }
                }

                if (ok)
                {
                    caps[@"MajorVersion"] = majorVersion;
                    caps[@"MinorVersion"] = minorVersion;
                    caps[@"Version"] = String.Format(@"{0}.{1}", majorVersion, minorVersion);
                }
            }
            else if (ua.Contains(@"Edge"))
            {
                if (!browser.IsBrowser(@"Edge"))
                {
                    browser.AddBrowser(@"edge");
                }

                IDictionary caps = browser.Capabilities;
                caps[@"Browser"] = @"Edge";

                // Determine browser version
                Match m = Regex.Match(ua, @"Edge/(\d+)\.(\d+)");
                if (m.Success)
                {
                    string majorVersion = m.Groups[1].Value;
                    string minorVersion = m.Groups[2].Value;
                    caps[@"MajorVersion"] = majorVersion;
                    caps[@"MinorVersion"] = minorVersion;
                    caps[@"Version"] = String.Format(@"{0}.{1}", majorVersion, minorVersion);
                }
            }
        }

        return browser;
    }
}
用户回答回答于

使用正则表达式,如:

Regex.IsMatch(this.Request.UserAgent, @"Trident/7.*rv:11")

Trident是IE使用的渲染引擎的名称。其他一些应用程序也使用Trident引擎,如维基百科文章中所示。但在用户代理中搜索Trident应该不成问题,因为没有其他主流浏览器使用Trident。

只有IE11使用三叉戟版本7,所以如果Trident/7使用正则表达式搜索,它应该找到IE11。

所属标签

可能回答问题的人

  • 人生的旅途

    10 粉丝484 提问6 回答
  • 不吃貓的鱼oo

    5 粉丝466 提问6 回答
  • 富有想象力的人

    4 粉丝0 提问5 回答
  • Richel

    8 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励