2011-11-17 12 views
5

Actualmente estoy buscando en las capacidades del navegador y estoy tratando de probar los archivos de definición del navegador que vienen con .NET 4.0. Para ello estoy usando un add-on para Firefox para cambiar el agente de usuario y tengo una página sencilla que da cuenta de lo siguiente:¿Por qué obtengo estos resultados extraños al mirar las capacidades del navegador?

Request.UserAgent 
Request.Browser.Id 
Request.Browser.Browser 
Request.Browser.MajorVersion 
Request.Browser.MinorVersion 
Request.Browser.Platform 
Request.Browser.IsMobileDevice 
Request.Browser.MobileDeviceManufacturer 
Request.Browser.MobileDeviceModel 

Generalmente esto da la información correcta sobre la base de los ejemplos proporcionados en los comentarios en los archivos predeterminados de definición del navegador. Sin embargo, estoy viendo resultados extraños de vez en cuando que no puedo explicar.

Tomemos el ejemplo de agente de usuario iPhone en el archivo iphone.browser definición que es la siguiente:

Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3 

Esto debería devolver el navegador como Safari, que lo hace. Esto se debe a la puerta de enlace del iPhone que tiene Safari como padre, que coincide con el término Safari.

Alterar el agente de usuario ligeramente por lo que emula el agente de usuario del cliente de correo en un iPhone significa la eliminación de la parte final del agente de usuario de la siguiente manera:

Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) 

Esto ahora debe volver Mozilla como el navegador, ya que no podrá coincidir con el término Safari. Sin embargo, al analizar esto inmediatamente después del primer informe se devuelve información incorrecta, y todavía se indica que el navegador es Safari.

Adición de un archivo personalizado .browser con la carpeta App_Browsers y modificando después de que parece que obligarlo a ser correcta temporalmente, casi como las definiciones o reglas están siendo almacenado en caché y no correr por completo en cada solicitud.

Esto también funciona a la inversa, si comienza con el segundo agente de usuario de ejemplo, al analizar el primero, se informará que es Mozilla en lugar de Safari.

¿Alguien puede explicar este comportamiento o una forma de evitarlo? ¿Está tratando de hacer algún tipo de almacenamiento en caché (no tan inteligente) donde hace suposiciones basadas en agentes de usuario similares?

Gracias.

Respuesta

1

Hay más en juego que simplemente buscar la cadena "Safari". Si nos fijamos en el user agent database utilizado por la implementación ASP.Net de Mono, verá que su primera cadena de agente de usuario más específica coincidirá con una de las reglas más específicas, y se establecerá la versión del navegador. Pero incluso la cadena de agente de usuario recortada aún golpea una regla que lo identifica como una variante de "iPhone", que luego se presenta como "Safari".

ASP.Net de Microsoft muy probablemente utiliza una base de datos muy similar, acabo de utilizar Mono como ejemplo ya que el código está disponible en la web.


Así que revisé mi respuesta y me di cuenta de que había malinterpretado por completo la pregunta. Tienes razón: el almacenamiento en caché está en acción aquí. .NET Framework intenta ahorrar tiempo analizando las cadenas de usuario-agente. Una vez que se analiza una cadena UA, el resultado se guarda en una tabla hash. La clave es la cadena UA, truncada.

De forma predeterminada, esta longitud de clave es de 64 caracteres, por lo que cuando se cambia el final de una cadena larga de UA no se observan cambios.Esta configuración está controlada por la propiedad UserAgentCacheKeyLength de HttpCapabilitiesDefaultProvider. Para verificarlo, añadí

<browserCaps userAgentCacheKeyLength="512" /> 

al elemento <system.web> en Web.config en mi proyecto de prueba. Con esta solución rápida, el problema desaparece.

+0

Si lo que dice es correcto, los resultados serían consistentes sin importar qué agente de usuario se analiza primero, pero este no es el caso como se describe en mi ejemplo. Puede ver las reglas por sí mismo, se almacenan con la carpeta de Framework correspondiente dentro de Windows en 'Config/Browsers'. En cuanto a su comentario "Hay más en el partido que solo buscar la cadena 'Safari'". esto es exactamente lo que coincide, como se puede ver en el archivo 'safari.browser' donde verá que hereda de Mozilla y simplemente lo extiende usando' ' – rrrr

+0

Acabo de notar la edición de este como alguien votó la pregunta, volveré a visitarla en algún momento cuando tenga tiempo e investigaré más. – rrrr

Cuestiones relacionadas