2011-11-17 7 views
5

Attualmente sto esaminando le funzionalità del browser e sto provando a testare i file di definizione del browser forniti con .NET 4.0. Per fare questo sto utilizzando un add-on per Firefox per cambiare l'user agent e ho una semplice pagina che riporta il seguente:Perché ottengo questi strani risultati quando guardo le funzionalità del browser?

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 questo dà le informazioni corrette in base agli esempi forniti nei commenti nei file di definizione del browser predefiniti. Tuttavia, di tanto in tanto vedo risultati strani che non riesco a spiegare.

Prendiamo l'esempio iPhone user agent nel file iphone.browser definizione che è il seguente:

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

Ciò dovrebbe restituire il browser come Safari, che lo fa. Questo dipende dal gateway IPhone con Safari come genitore, che corrisponde al termine Safari.

Alterare l'agente utente leggermente in modo che emula l'agente utente del client di posta elettronica su un iPhone significa rimuovere la parte terminale della user agent come segue:

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

Questa società deve restituire Mozilla come browser, in quanto non sarà in grado di eguagliare il termine Safari. Tuttavia, analizzando questo immediatamente dopo il primo report torna informazioni errate, e indica ancora il browser per essere Safari.

Aggiunta di un .browser file personalizzato con la cartella App_Browsers e quindi modificando che sembra costringerlo a essere temporaneamente corretto, quasi come le definizioni o le regole vengono memorizzate nella cache e non funzionare pienamente su ogni richiesta.

Questo funziona anche in questo caso, se si inizia con il secondo agente utente di esempio, dopo aver analizzato il primo, verrà segnalato come Mozilla anziché Safari.

Qualcuno può spiegare questo comportamento o un modo per aggirare il problema? Sta cercando di fare una specie di cache (non così) intelligente in cui fa ipotesi basate su agenti utente simili?

Grazie.

risposta

1

C'è ancora qualcosa in più rispetto alla semplice ricerca della stringa "Safari". Se osservi l'user agent database utilizzato dall'implementazione ASP.Net di Mono, vedrai che la tua prima stringa di agente utente più specifica corrisponderà a una delle regole più specifiche e verrà impostata la versione del browser. Ma anche la stringa di user agent ritagliata colpisce ancora una regola che la identifica come una variante di "iPhone", che viene successivamente presentata come "Safari".

ASP.Net di Microsoft utilizza molto probabilmente un database molto simile, ho appena usato Mono come esempio poiché il codice è facilmente disponibile sul web.


Così, ho rivisitato la mia risposta, e mi resi conto completamente travisato la domanda! Hai ragione: il caching è in azione qui. .NET Framework tenta di risparmiare tempo analizzando le stringhe user-agent. Una volta analizzata una stringa UA, il risultato viene salvato in una tabella hash. La chiave è la stringa UA, troncata.

Per impostazione predefinita questa lunghezza della chiave è di 64 caratteri, motivo per cui quando si modifica la fine di una stringa UA lunga non si osservano modifiche.Questa impostazione è controllata dalla proprietà UserAgentCacheKeyLength di HttpCapabilitiesDefaultProvider. Per verificare, ho aggiunto

<browserCaps userAgentCacheKeyLength="512" /> 

all'elemento <system.web> in Web.config nel mio progetto di test. Con questa soluzione rapida il problema scompare.

+0

Se ciò che dici è corretto, i risultati sarebbero coerenti, indipendentemente dall'agente utente che viene analizzato per primi, ma questo non è il caso indicato nel mio esempio. Puoi vedere le regole per te stesso, sono memorizzate con la cartella Framework pertinente all'interno di Windows in 'Config/Browsers'. Per quanto riguarda il tuo commento "C'è dell'altro per la partita piuttosto che cercare la stringa" Safari "." questo è esattamente ciò a cui corrisponde, come si può vedere nel file 'safari.browser' dove lo vedrete ereditato da Mozilla e semplicemente lo si estende usando' ' – rrrr

+0

Ho appena notato la modifica per questo come qualcuno ha votato la domanda, la rivisiterò ad un certo punto quando avrò tempo e approfondirò ulteriormente. – rrrr