用C#检测IE11

时间:2013-08-22 08:50:27

标签: c# browser

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

因此,如果浏览器小于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只是一个具有2个字符串属性(名称和版本)的对象。

5 个答案:

答案 0 :(得分:11)

我刚刚为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);
    }
}

答案 1 :(得分:10)

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

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

此处最重要的部分是删除 MSIE 令牌并添加,如Gecko 。这意味着如果Internet Explorer没有被识别为自身(因此旧的IE黑客将不会应用于它),则宁愿将其识别为Gecko类型的浏览器。如果您想将其标识为IE,则必须查找 Trident 令牌,并且版本来自 rv 令牌。

现在,只有在出于某种原因需要检查服务器端的用户代理时,才应考虑上述所有内容。对于使用JavaScript回退,HTML5 polyfill等,您应该检查客户端代码是否支持给定的功能(有些库可以帮助解决这个问题,例如Modernizr)。

答案 2 :(得分:5)

我一直在试验IE11和MVC,结果证明IE11将自己标识为Request.Browser.Browser =“Mozilla”和MajorVersion = 0.希望它有所帮助。

答案 3 :(得分:1)

Request.Browser信息基于我机器上的浏览器定义文件。

C:\的Windows \ Microsoft.NET \框架\ v4.0.30319 \配置\浏览器

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的最新版本应该包含正确的浏览器定义文件,但看起来有些较旧版本可能需要hotfix来获取它。

更新:我通过上面的文字引用了Internet Explorer 11及更高版本。后来的版本可能是Edge。到目前为止,我还没有看过浏览器定义文件,但怀疑它会再次出现不同。

答案 4 :(得分:0)

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