asp.net - ie11 - Detección de Internet Explorer 11 en el lado del servidor.
internet explorer detection javascript (5)
Todos sabemos que la detección de IE11 no funciona con los idiomas del lado del servidor porque Microsoft ha eliminado la indicación del navegador IE / MSIE y ahora es totalmente "Mozilla".
También sé que hacer detección / versión del navegador es arriesgado, pero nos ha servido a todos en el pasado.
Algunos requisitos para un sitio web son cosas como:
debe funcionar con cierta versión de firefox y la versión superior debe funcionar con cierta versión de chrome y la versión superior debe funcionar con cierta versión de safari (algunas a continuación y algunas más nuevas) deben funcionar con IE> = 8
así que aquí está el problema ... IE11 indica en mi lista que no es compatible. Quiero admitirlo desde el lado web de las cosas en el servidor (ASP.NET/MVC)
no está claro exactamente cómo detectar esto desde el lado del servidor. ¿Alguien sabe cómo?
este es el agente de usuario que ahora se muestra en IE 11:
"Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; rv: 11.0) como Gecko"
rv: 11.0 nos dice que su IE11, sin embargo, hacer un análisis que todavía signifique que, por ejemplo, podría ser el cromo de una versión determinada que no es compatible con dicho requisito o incluso con Firefox.
Entonces, ¿cuál es la mejor manera de ver si es IE 11 o superior?
No estoy seguro de buscar desde "Trident" y en adelante porque no sé si otros navegadores usan eso o no.
Cualquier dirección es bienvenida.
Para mantener la compatibilidad con el código existente, creé un proveedor personalizado para que Request.Browser
devuelva la información como se esperaba. Por ejemplo, Browser.Browser
será "IE" y no "InternetExplorer", que es el nuevo valor después de instalar el hotfix.
Además, este enfoque devuelve la versión real de IE, no la versión 7 cuando está en la vista de compatibilidad. Tenga en cuenta que Browser.Type
devolverá "IE7" cuando esté en la vista de compatibilidad en caso de que necesite detectarlo, o podría modificar fácilmente el proveedor personalizado para cambiar. Escriba también.
El enfoque es simple. Derive una clase de HttpCapabilitiesDefaultProvider
y establezca BrowserCapabilitiesProvider
en una instancia de su clase.
En Global.asax.cs:
protected void Application_Start(Object sender, EventArgs e)
{
...
HttpCapabilitiesBase.BrowserCapabilitiesProvider = new CustomerHttpCapabilitiesProvider();
...
}
Defina su clase: ACTUALIZADO PARA INCLUIR EL NAVEGADOR DE BORDES MICROSOFT
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;
}
}
Resolví esto utilizando el Regex a continuación después de tener un sistema de eliminación para verificar qué navegador se está utilizando para acceder al sitio.
en este caso, incluso si el navegador "IE" está marcado y devuelve falso, sigo adelante, uso esta expresión regular y verifico si coincide con el agente de usuario:
(?:/b(MS)?IE/s+|/bTrident//7/.0;.*/s+rv:)(/d+)
Espero que esto ayude a alguien. Lo probé y funciona bien. También cambié la rv a 12 y más, y también funciona bien en caso de que en IE12, cambien rv a 12.
Suena como si estuvieras en una lista blanca de navegadores, lo cual no es una buena idea. Realmente necesitas hacer la detección de capacidades del lado del cliente, en general, en su lugar. MVC realmente no sabe qué navegador es, el objeto Request.Browser puede darte una idea, pero eso no es realmente confiable, como es el caso de IE 11. Me dice la versión 11 en mi máquina dev, pero 7 en mi Servidor, que puede ser un error catastrófico.
Construyo aplicaciones de una sola página y he adoptado una actitud similar a la de Google sobre el hecho de que solo se admite la versión actual y anterior de un navegador. Cuando detecto un navegador desactualizado, servidor un sitio ''central'' que es solo un CSS básico y un marcado, no JavaScript. Es más fácil así, hace que el desarrollo sea mucho más fácil.
De todos modos, la forma en que detecto es probar las versiones actuales de IE de la siguiente manera:
public static bool IsModernIE() {
return HttpContext.Current.Request.Browser.Browser == "InternetExplorer";
}
Es un método de ayuda HTML. Así que en tu cshtml puedes usar la prueba. En mi controlador llamo a las versiones individuales de pruebas. Esta es, en última instancia, una manera muy frágil de hacerlo. Básicamente estoy dibujando una línea en la arena entre el IE moderno (10/11) y el IE antiguo (9-). Esta prueba podría ser irrelevante con la próxima versión y aún no la he probado con Xbox One.
Tengo una biblioteca que uso, publicada en GitHub. Lo llamaría Alfa utilizable en este momento, así que tómalo y corre con él si quieres. Quiero hacer las pruebas más configurables externamente, etc. Aquí está la URL del repositorio, https://github.com/docluv/SPAHelper . En realidad lo uso en mi Blog, http://love2dev.com .
Usa una expresión regular como:
Regex.IsMatch(this.Request.UserAgent, @"Trident/7.*rv:11")
Trident es el nombre del motor de renderizado que usa IE. Algunas otras aplicaciones también utilizan el motor Trident, como se puede ver en el artículo de Wikipedia. Pero no debería ser un problema buscar Trident en el agente de usuario, ya que ningún otro navegador importante usa Trident.
Solo IE11 usa Trident versión 7, por lo que si busca Trident/7
con la expresión regular, debería encontrar IE11.
public ActionResult Index()
{
var browser = this.Request.Browser;
System.Diagnostics.Trace.WriteLine(browser.Browser); // InternetExplorer
System.Diagnostics.Trace.WriteLine(browser.MajorVersion); // 11
return View();
}
Tenga en cuenta que necesita .NET 4.5 o .NET 4.0 con http://support.microsoft.com/kb/2836939/en-us instalado para detectar IE11 correctamente.