21

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

我也知道进行浏览器检测/版本是有风险的,但过去对我们所有人都有好处。

网站的一些要求是:

必须使用特定版本的 firefox 及更高版本 必须使用特定版本的 chrome 及更高版本 必须使用特定版本的 safari(一些低于和一些更新)必须使用 IE >= 8

所以这是问题所在...... IE11 在我的列表中表明它不受支持。我想从服务器上的 Web 端支持它(ASP.NET/MVC)

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

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

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

rv:11.0 告诉我们它的 IE11,但是对其进行解析仍然意味着,例如,它可能是某个版本的 chrome,这种要求甚至 Firefox 都不支持。

那么,在这里查看它是否确实是 IE 11 或更高版本的最佳方法是什么?

我不太确定从“三叉戟”及以后搜索,因为我不知道其他浏览器是否使用它。

欢迎任何方向。

4

5 回答 5

17

使用正则表达式,如:

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

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

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

于 2013-11-15T12:17:48.487 回答
13

为了保持与现有代码的兼容性,我创建了一个自定义提供程序,以便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();
    ...
}

定义你的班级:更新包括微软边缘浏览器

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;
    }
}
于 2013-12-30T21:33:04.457 回答
8

在使用淘汰系统检查正在使用哪个浏览器访问该站点后,我使用下面的正则表达式解决了这个问题。

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

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

我希望这可以帮助别人。我对其进行了测试并且工作正常。我还将 rv 更改为 12 及更高版本,如果在 IE12 中将 rv 更改为 12,它也可以正常工作。

于 2013-11-15T12:41:47.533 回答
1
    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。

于 2013-11-15T11:33:00.450 回答
-1

听起来您确实将浏览器列入白名单,这不是一个好主意。通常,您确实需要对功能进行客户端检测。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上使用了它。

于 2013-11-15T20:36:35.127 回答