Cual es el browser tiene mi cliente? que versión? soporta JavaScript? Poder utilizar la detección del browser para escribir propiedades especificas en webcontrol, así:
<asp:Label ID="lbl1" runat="server" Text="Mensaje (general)" ie:Text="Mensaje solo para IE" mozillafirefox:Text="Mensaje para Firefox" safari:Text="Mensaje para Safari" />
Jugando al detective con HttpBrowserCapabilities
Podemos utilizar esta clase para preguntar sobre «capacidades» del browser del cliente.
Ejemplo de estas propiedades:
Propiedades… | Resultado en IE7 | Firefox |
Type Obtiene el nombre y el número de versión principal (a la izquierda del separador) del explorador Browser Obtiene la cadena del explorador (si existe) que éste ha enviado en el encabezado de la solicitud User-Agent. … |
Type: IE7 |
Type: Firefox2.0.0.14 Browser: Firefox Version: 2.0.0.14 MajorVersion: 2 MinorVersionString: .0.0.14 MinorVersion: 0 Tables: True Cookies: True V B S c r i p t : False (*) J a v a S c r i p t: True (*) JavaApplets: True JScriptVersion: 0.0 ActiveXControls: False |
(*) Separación de letras únicamente para que pueda publicar en el blog.
Existe una lista de propiedades que posee la clase HttpBrowserCapabilities.
Para el ejemplo de escribir propiedades especificas necesitamos el Browser.Id
Request.Browser.Id
Como recorrer todas las propiedades…?
Aquí Reflection a nuestra ayuda….
Private Function ArmarTodasLasPropiedades() As String Dim bc As HttpBrowserCapabilities = Request.Browser Dim tipoControl As Type = bc.GetType Dim msj As New Text.StringBuilder 'Listado de propiedades Dim propiedades() As System.Reflection.PropertyInfo = tipoControl.GetProperties 'Recorriendo las propiedades y sus valores For Each p As System.Reflection.PropertyInfo In propiedades Dim nombre As String = p.Name Dim valor As String Try valor = Convert.ToString(p.GetValue(bc, Nothing)) Catch ex As Exception valor = "ERROR" End Try 'Armando visualizacion msj.Append(nombre) msj.Append(": ") msj.Append(valor) msj.Append(vbCrLf) Next Return msj.ToString End Function
Pero… (siempre hay «peros») no detecta la configuración del usuario actual
Es decir con esta investigación (a medias) solo logramos detectar las capacidades «inherentes» del explorador, pero no refleja como el usuario tiene actualmente configurado
Si el usuario deshabilitó JavaScript, y el navegador lo soporta, tendremos la propiedad: JavaScript=True.
Si quieres detectar la configuración del usuario hay un componente pago para detectar incluso plugins como Flash, se llama BrowserHawk, para detección avanzada 😉
Demo: http://www.cyscape.com/showbrow.aspx?bhcp=1
Sigamos con lo nuestro…HttpBrowserCapabilities
La magia?
(un poco de historia para nostálgicos…)
Antes en ASP Clásico hacíamos uso de un componente del lado del servidor de Microsoft Browser Capabilities Component (Browscap.dll) y un archivo de texto (Browscap.ini) que era el mapeador entre el browser y las capacidades…
Algo asi:
Set BrowserType = Server.CreateObject("MSWC.BrowserType")
(que buenos y no tan buenos recuerdos del SET)
y el archivo Browscap.ini:
[AOL 9.0/IE 7.0]
Parent=DefaultProperties
Browser=AOL
Version=7.0
MajorVer=7
Win32=true
Frames=true
IFrames=true
Tables=true …
Este archivo, si lo pensamos detenidamente, por cada generación nueva de navegadores y con la salida de otros había que actualizar… (siempre hay que actualizar) para eso este sitio Browser Capabilities Project
En mi querido WinXP estan aquí:
y con .NET 1.1
Ya no teníamos archivos de configuración .ini ahora tenemos .config, entonces? a escribir en el config.
para que este disponible en todas las aplicaciones se encuentra en el machine.config, seccion browseCaps
Si quieres verlo:
Archivo: C:WINDOWSMicrosoft.NETFrameworkv1.1.4322CONFIGmachine.config
Sección: <browserCaps>
(actualizar el browserCaps para ASP.NET 1.1 aquí)
y ahora? donde está en ASP.NET 2.0?
Si ves el archivo anterior tenemos un «kilometraje» bastante importante de configuración…
En ASP.NET 2.0 se no se utiliza la sección browserCaps (aunque se mantiene…se la puede utilizar combinando las dos fuentes de información)
Ahora los datos de capacidades de navegadores están ubicados en archivos de definición de explorador (extension .browser) en la carpeta:
C:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIGBrowsers
y si en nuestro aplicación podemos introducir en la carpeta App_Browser
NOTA 1: Si cambiamos algún archivo .browser en nuestra aplicación (directorio App_Browser), la aplicacion se compilara nuevamente en la proxima te peticion
NOTA 2: Si cambiamos algún archivo .browser en el directorio del framework ({windir}Microsoft.NETFramework{version}CONFIGBrowsers) vamos a tener que regenerar el assembly correspondiente con la herramienta Aspnet_regbrowsers.exe, que compila y la coloca en el GAC. Esto también lo puedes hacer por codigo con BrowserCapabilitiesCodeGenerator.
Pero no es recomendable modificar las que trae por defecto .NET sino mas bien agregar nuevos archivos, porque en algunos service pack se pueden actualizar.
Ejemplo de un archivo:
{windir}Microsoft.NETFrameworkv2.0.50727CONFIGBrowsersmozilla.browser
<!-- sample UA "Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7) Gecko/20040707 Firefox/0.9.2" --> <browser id="MozillaFirefox" parentID="MozillaRV"> <identification> <userAgent match="Gecko/d+ Firefox/(?'version'(?'major'd+)(?'minor'.[.d]*))" /> </identification> <capabilities> <capability name="browser" value="Firefox" /> <capability name="majorversion" value="${major}" /> <capability name="minorversion" value="${minor}" /> <capability name="version" value="${version}" /> <capability name="type" value="Firefox${version}" /> </capabilities> </browser>
....
Entonces con el ID que podemos personalizar las propiedades de nuestro webcontrol
<asp:Label ID="lbl1" runat="server" Text="Mensaje (general)" ie:Text="Mensaje solo para IE" mozillafirefox:Text="Mensaje para Firefox" safari:Text="Mensaje para Safari" />
Enlaces
- HttpBrowserCapabilities (Clase)
Permite al servidor recopilar información sobre las posibilidades del explorador que se ejecuta en el cliente. - Controles de servidor Web ASP.NET y funciones del explorador
- Browser Capabilities Project
- BrowserCaps (archivos para ASP.NET 1.1, ASP.NET 2.0)
- BrowserHawk
Componente que podemos utilizar para detener por ejemplo Plugins como Flash (comercial)
Demo: http://www.cyscape.com/showbrow.aspx?bhcp=1