使用C#检测IE11版本

13

在加载网页之前,我会检测浏览器和版本以确定兼容性。

因此,如果浏览器低于IE7版本,则显示不兼容消息。

在IE11中测试网页时,我的网页显示不兼容消息。

我目前从以下位置获取浏览器名称:

var browser = Request.Browser.Browser;

以及来自的版本

var version = Request.Browser.Version;

我接着检查浏览器是IE,且版本 >= 7。

我认为IE11的用户代理已经改变。 那么用C#检测浏览器是否>= IE7的最佳方法是什么。

编辑:

Request.Browser.Browser返回浏览器名称,例如IE。Request.Browser.Version返回版本号。 我将它们添加到一个BrowserVersion对象中,并将这些值与我拥有的受支持浏览器版本数组进行比较。

private static List<BrowserVersion> m_supportedBrowsers = new List<BrowserVersion>()
        {
            new BrowserVersion("IE", 7),
            new BrowserVersion("Firefox", 3),
            new BrowserVersion("AppleMAC-Safari", 5),
            new BrowserVersion("Safari", 5)
        };

BrowserVersion只是一个拥有两个字符串属性(名称和版本)的对象。


7
检查功能性,而不是浏览器本身。 - Tigran
然后我会检查浏览器是否为IE,且版本号大于等于7。你是如何进行检查的呢?我认为IE11的用户代理已经发生了变化,你尝试过查找用户代理字符串或者Request.Browser的工作方式吗? - CodeCaster
功能测试的问题在于它们还隐藏了ActiveXObject属性,而这可能是一些人正在测试的内容。 - Jarrod
5个回答

15

我刚刚安装了适用于Windows 7 Release Preview的IE11,我的代码也崩溃了。经过一些快速测试,我注意到浏览器的字符串现在已经不同了。它现在返回为“InternetExplorer”,而不是“IE”。

这段代码现在似乎对我有用了。

private void CheckIfUsingSupportedBrowser(HttpContext context)
{
    bool isBrowserSupported = ((context.Request.Browser.Browser == "IE" || context.Request.Browser.Browser == "InternetExplorer") && context.Request.Browser.MajorVersion >= 7) ||
                                (context.Request.Browser.Browser == "Firefox" && context.Request.Browser.MajorVersion >= 13) ||
                                (context.Request.Browser.Browser == "AppleMAC-Safari" && context.Request.Browser.MajorVersion >= 5) ||
                                (context.Request.Browser.Browser == "Safari" && context.Request.Browser.MajorVersion >= 5) ||
                                (context.Request.Browser.Browser == "Chrome" && context.Request.Browser.MajorVersion >= 13);

    if (!isBrowserSupported) 
    {
        Navigator.Navigate(PageKeys.SupportedBrowsers);
    }
}

2
这真是令人难以置信,他们居然这样做了... 有人知道这个变化的官方文档在哪里吗? - theycallmemorty
1
@theycallmemorty 这里是微软提供的一些更改原因的链接 http://msdn.microsoft.com/zh-cn/library/ie/bg182625(v=vs.85).aspx - Scott Wylie
谢谢,我最终在我的研究中遇到了这个问题,但是忘记在这里发布它! - theycallmemorty

11

是的,用户代理已更改为:

Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko

这里最重要的部分是去除了 MSIE 标记并添加了 like Gecko。这意味着如果 Internet Explorer 没有被识别为自身(因此旧版 IE 的 hack 将不会应用于它),它更喜欢被识别为 Gecko 类型的浏览器。如果你想将其标识为 IE,则必须查找 Trident 标记,并且版本通过 rv 标记得到。

现在,除非出于某种原因需要在服务器端检查用户代理,否则应该只考虑上述内容。对于使用 JavaScript 回退、HTML5 polyfills 等,应该在客户端代码中检查所需功能是否受支持(有一些库可以帮助完成这项工作,例如 Modernizr)。


6

我一直在尝试使用IE11和MVC,结果发现IE11将自己标识为Request.Browser.Browser = "Mozilla",MajorVersion = 0。希望这可以帮到你。


3

Request.Browser信息基于浏览器定义文件,这些文件位于我的计算机上的以下位置。

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Browsers

Internet Explorer的文件名为ie.browser

我可以看到,对于Internet Explorer 11及更高版本,处理方式与所有先前版本有很大不同。对于以前的版本,有一个名为IE的基本定义,它又基于Mozilla。

<browser id="IE" parentID="Mozilla">

所有以前版本的依赖关系链都可以追溯到 IE。以下是该链的一部分示例。

<browser id="IE10Plus" parentID="IE6Plus">

而另一方面,Internet Explorer 11则有着不同的渊源,直接基于Mozilla

<browser id="InternetExplorer" parentID="Mozilla">

IE浏览器,包括Internet Explorer 11之前的所有版本(没有覆盖此值),使用以下定义来判断 browser 功能。

<capability name="browser"              value="IE" />

Internet Explorer 11及以上版本使用以下内容。

<capability name="browser"              value="InternetExplorer" />

总之,如果你对任何版本的Internet Explorer感兴趣,那么你需要使用类似以下内容的东西。
Request.Browser.Browser == "IE" || Request.Browser.Browser == "InternetExplorer"

为了识别一个特定的版本,您需要引用 Request.Browser.Version 属性。该属性是从浏览器传递的用户代理字符串中填充的。需要注意的是,在 Internet Explorer 11 和之后的版本与早期版本之间存在差异。

//Versions prior to Internet Explorer 11.
<userAgent match="MSIE (?'version'(?'major'\d+)(\.(?'minor'\d+)?)(?'letters'\w*))(?'extra'[^)]*)" />

//Internet Explorer 11 and later.
<userAgent match="Trident/(?'layoutVersion'[7-9]|0*[1-9]\d+)(\.\d+)?;(.*;)?\s*rv:(?'version'(?'major'\d+)(\.(?'minor'\d+)))" />

版本号是指在早期版本的MSIE后面的数字,在Internet Explorer和以后的版本中是在rv:后面的数字。
一个近期的.Net Framework应该包括正确的浏览器定义文件,但看起来一些旧版本可能需要一个热更新补丁才能解决这个问题。 更新:我在上面的文本中提到了Internet Explorer 11和以后的版本。后来的版本可能是Edge。我还没有看到适用于Edge的浏览器定义文件,但我怀疑它会有所不同。

0
你使用的是哪个版本的.NET Framework?根据我的分析,低于4.5版本的无法将IE 11识别为Internet Explorer浏览器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接