Jugando al detective con HttpBrowserCapabilities, preguntando propiedades del browser en ASP.NET

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.

(más propiedades…)

Type: IE7
Browser: IE
Version: 7.0
MajorVersion: 7
MinorVersionString: .0
MinorVersion: 0
Tables: True
Cookies: True
V B S c r i p t : True (*)
J a v a S c r i p t: True (*)
JavaApplets: True
JScriptVersion: 5.6
ActiveXControls: True

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í:
image

 

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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *