繁体   English   中英

服务器端的Internet Explorer 11检测

[英]Internet explorer 11 detection on server side

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

我也知道做浏览器检测/版本存在风险,但过去一直很好。

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

必须使用某些版本的firefox以上必须使用某些版本的chrome及以上必须使用某些版本的safari(一些下面和一些较新的)必须使用IE> = 8

所以这就是问题... IE11在我的列表中指出它不受支持。 我想从服务器上的东西的Web端支持它(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”开始搜索,因为我不知道其他浏览器是否使用它。

欢迎任何方向。

使用正则表达式,如:

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

Trident是IE使用的渲染引擎的名称。 其他一些应用程序也使用Trident引擎,您可以在Wikipedia文章中看到。 但是在用户代理中搜索Trident应该不是问题,因为没有其他主流浏览器使用Trident。

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

为了保持与现有代码的兼容性,我创建了一个自定义提供程序,因此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来检查这一点,以检查用于访问该站点的浏览器。

在这种情况下,即使检查浏览器“IE”并返回false,我继续使用此正则表达式并检查它是否与用户代理匹配:

(?:\\b(MS)?IE\\s+|\\bTrident\\/7\\.0;.*\\s+rv:)(\\d+)

我希望这可以帮助别人。 我测试了它并且工作正常。 我还将rv改为12及以上,如果在IE12中它们将rv改为12,它也可以正常工作。

    public ActionResult Index()
    {
        var browser = this.Request.Browser;
        System.Diagnostics.Trace.WriteLine(browser.Browser); // InternetExplorer
        System.Diagnostics.Trace.WriteLine(browser.MajorVersion); // 11
        return View();
    }

请注意,您需要安装了http://support.microsoft.com/kb/2836939/en-us的 .NET 4.5或.NET 4.0才能正确检测IE11。

听起来好像是白名单浏览器,这不是一个好主意。 通常,您确实需要对功能进行客户端检测。 MVC真的不知道它是什么浏览器,Request.Browser对象可以给你一些想法,但这不是真的可靠,这是IE 11的情况。它告诉我我的开发机器上的版本11,但我的7服务器,这可能是一个灾难性的错误。

我构建了单页应用程序,并采用了与Google类似的态度,仅支持当前和以前版本的浏览器。 当我发现一个过时的浏览器时,我服务的是一个“核心”网站,它只是一些基本的CSS和标记,没有JavaScript。 这种方式更简单,使开发变得更加容易。

无论如何,我检测的方式是测试当前版本的IE,如下所示:

    public static bool IsModernIE() {

        return HttpContext.Current.Request.Browser.Browser == "InternetExplorer";

    }

它是一个HTML帮助方法。 所以在你的cshtml中你可以使用测试。 在我的控制器中,我调用了各个版本的测试。 这最终是一种非常脆弱的方式。 我基本上在现代IE(10/11)和旧IE(9-)之间画了一条线。 这个测试可能与下一个版本无关,我还没有测试过Xbox One。

我有一个我使用的库,发布在GitHub上。 我现在称它为可用的Alpha,所以如果你愿意的话就把它当作它来运行吧。 我想让测试更加外部可配置,等等。这里是存储库的URL, https://github.com/docluv/SPAHelper 我实际上在我的博客http://love2dev.com上使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM