Ahm*_*yas 20 asp.net internet-explorer asp.net-mvc-4
我们都知道IE11检测不适用于服务器端语言,因为微软已经删除了IE/MSIE浏览器指示,现在完全是"Mozilla".
我也知道做浏览器检测/版本存在风险,但过去一直很好.
网站的一些要求是这样的:
必须使用某些版本的firefox及以上必须使用某些版本的chrome及以上必须使用某些版本的safari(一些下面和一些较新的)必须使用IE> = 8
所以这就是问题... IE11在我的列表中指出它不受支持.我想从服务器上的东西的Web端支持它(ASP.NET/MVC)
目前尚不清楚如何从服务器端检测到这一点.有谁知道怎么样?
这是IE 11中显示的用户代理:
"像Gecko一样的Mozilla/5.0(Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)"
rv:11.0告诉我们它的IE11,然而对它进行解析仍然意味着,例如,它可能是某个版本的chrome,在这样的要求中甚至不支持firefox.
那么,在这里看看IE 11或更高版本的最佳方式是什么?
我不太确定从"Trident"开始搜索,因为我不知道其他浏览器是否使用它.
欢迎任何方向.
Tay*_*nli 16
使用正则表达式,如:
Regex.IsMatch(this.Request.UserAgent, @"Trident/7.*rv:11")
Run Code Online (Sandbox Code Playgroud)
Trident是IE使用的渲染引擎的名称.其他一些应用程序也使用Trident引擎,您可以在Wikipedia文章中看到.但是在用户代理中搜索Trident应该不是问题,因为没有其他主流浏览器使用Trident.
只有IE11使用Trident版本7,所以如果你Trident/7
用正则表达式搜索,它应该找到IE11.
Dou*_*eny 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();
...
}
Run Code Online (Sandbox Code Playgroud)
定义您的课程:更新为包括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;
}
}
Run Code Online (Sandbox Code Playgroud)
我在使用淘汰系统后使用下面的Regex来检查这一点,以检查用于访问该站点的浏览器.
在这种情况下,即使检查浏览器"IE"并返回false,我继续使用此正则表达式并检查它是否与用户代理匹配:
(?:\b(MS)?IE\s+|\bTrident\/7\.0;.*\s+rv:)(\d+)
我希望这可以帮助别人.我测试了它并且工作正常.我还将rv改为12及以上,如果在IE12中它们将rv改为12,它也可以正常工作.