Asp.net 在服务器端检测Internet explorer 11

Asp.net 在服务器端检测Internet explorer 11,asp.net,internet-explorer,asp.net-mvc-4,Asp.net,Internet Explorer,Asp.net Mvc 4,我们都知道IE11检测不适用于服务器端语言,因为微软已经删除了IE/MSIE浏览器指示,现在完全是“Mozilla” 我也知道进行浏览器检测/版本更新是有风险的,但在过去我们都做得很好 网站的一些要求如下: 必须使用特定版本的firefox及以上版本 必须使用特定版本的chrome及以上版本 必须使用特定版本的safari(一些在下面,一些更新) 必须使用IE>=8 这就是问题所在。。。IE11在我的列表中指出它不受支持。我想从服务器上的web端支持它(ASP.NET/MVC) 目前还不清楚如何

我们都知道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或更高

我不太确定是否从“三叉戟”开始搜索,因为我不知道其他浏览器是否使用该功能

欢迎任何指示

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

请注意,您需要安装.NET 4.5或.NET 4.0才能正确检测IE11。

使用如下正则表达式:

Regex.IsMatch(this.Request.UserAgent, @"Trident/7.*rv:11")
是IE使用的渲染引擎的名称。其他一些应用程序也使用Trident引擎,正如您在维基百科文章中看到的那样。但是在用户代理中搜索Trident应该不是问题,因为没有其他主流浏览器使用Trident


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

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

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

(?:\b(MS)?IE\s+\b驱动器\/7\.0;*\s+rv:)(\d+)


我希望这对某人有帮助。我测试了它,效果很好。我还将rv更改为12及以上,如果在IE12中,他们将rv更改为12,它也可以正常工作。

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

我开发单页应用程序,并采取了与谷歌类似的态度,只支持当前和以前版本的浏览器。当我检测到一个过时的浏览器时,我会为一个“核心”站点提供服务器,它只是一些基本的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。我在我的博客上用过

为了保持与现有代码的兼容性,我创建了一个自定义提供程序,以便
请求。浏览器将按预期返回信息。例如,
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;
    }
}

在我看来,问题的存在是因为您将受支持的浏览器列入白名单,而不是将不受支持的浏览器列入黑名单。你提到这可能会打破:你不能将未来的浏览器列入白名单,因为它们还不存在。但是,您可以将不受支持的浏览器列入黑名单,因为这一切都已经过去了。你考虑过这个了吗?同意你,乔恩。这需要一点测试,但让我看看我能做些什么。@Jon-重新查看代码和注释,似乎还有其他浏览器我们不支持,比如netscape或一般的移动设备,opera或netscape。。。。既然我没有这些浏览器来检查将报告的内容并拒绝它们,那么该如何处理呢?这取决于您需要对不允许不受支持的浏览器有多严格。如果你想要100%严格,那么黑名单将是一场噩梦。也许白名单可能是一种方式——这取决于你的具体要求。@Jon-同意。我们有一套定义为“禁止”的系统,但没有那么多。任何网景、任何safari(1除外)、任何opera都是不允许的。然后,我们有3个浏览器(即firefox和chrome),它们应该是某个版本或更高版本的浏览器。朱