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 对象中,并将这些值与我也拥有的支持的浏览器版本数组进行比较。IE

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 个字符串属性(名称和版本)的对象。

4

5 回答 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);
    }
}
于 2013-09-18T19:20:27.883 回答
11

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

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

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

现在,只有当您出于某种原因需要检查服务器端的用户代理时,才应考虑上述所有内容。对于使用 JavaScript 后备、HTML5 polyfill 等,您应该检查客户端代码中是否支持给定的功能(例如Modernizr有帮助的库)。

于 2013-08-22T09:23:36.810 回答
6

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

于 2013-12-04T15:23:55.553 回答
2

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以前版本的版本和rv:Internet Explorer 及更高版本的版本。

.Net Framework 的最新版本应该包含正确的浏览器定义文件,但看起来一些旧版本可能需要修补程序才能获得它。

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

于 2015-09-04T10:07:51.730 回答
0

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

于 2014-03-25T18:15:30.247 回答