Почему я получаю такие странные результаты, глядя на возможности браузера? - PullRequest
5 голосов
/ 17 ноября 2011

В настоящее время я изучаю возможности браузера и пытаюсь протестировать файлы определений браузера, которые поставляются с .NET 4.0.Для этого я использую надстройку для Firefox, чтобы изменить пользовательский агент, и у меня есть простая страница, которая сообщает следующее:

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

Обычно это дает правильную информацию, основанную на примерах, приведенных вкомментарии в файлах определения браузера по умолчанию.Однако время от времени я вижу странные результаты, которые не могу объяснить.

Возьмите пример пользовательского агента iPhone в файле определения iphone.browser, который выглядит следующим образом:

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

Этодолжен вернуть браузер как Safari, что он и делает.Это связано с тем, что шлюз IPhone имеет Safari в качестве родителя, что соответствует термину Safari.

. Небольшое изменение агента пользователя для эмуляции агента пользователя почтового клиента на iPhone означает удаление конца.часть пользовательского агента выглядит следующим образом:

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

Теперь это должно вернуть Mozilla в качестве браузера, так как он не сможет найти совпадение по термину Safari.Тем не менее, анализ этого сразу после того, как первый сообщает неверную информацию, все еще указывает, что браузер является Safari.

Добавление пользовательского файла .browser с папкой App_Browsers, а затем изменение, которое, по-видимому, вынуждает егобыть корректным временно, почти как определения или правила кэшируются и не полностью выполняются при каждом запросе.

Это работает и по-другому, если вы начинаете со второго примера пользовательского агента, то после анализа первого он будетсообщить, что это Mozilla вместо Safari.

Кто-нибудь может объяснить это поведение или способ обойти это?Пытается ли он сделать что-то вроде (не очень) умного кеширования, когда он делает предположения на основе похожих пользовательских агентов?

Спасибо.

1 Ответ

1 голос
/ 29 ноября 2011

Матч - это больше, чем просто поиск строки "Safari". Если вы посмотрите на базу данных пользовательских агентов , используемую реализацией ASP.Net в Mono, вы увидите, что ваша первая более конкретная строка пользовательского агента будет соответствовать одному из более конкретных правил, и будет установлена ​​версия браузера. , Но даже урезанная строка пользовательского агента все еще попадает в правило, которое идентифицирует его как некоторый вариант «iPhone», который позже представляется как «Safari».

Microsoft ASP.Net, скорее всего, использует очень похожую базу данных, я просто использовал Mono в качестве примера, поскольку код легко доступен в Интернете.


Итак, я вернулся к своему ответу и понял, что полностью неверно истолковал вопрос! Вы правы: кеширование здесь действует. .NET Framework пытается сэкономить время при разборе строк агента пользователя. После анализа строки UA результат сохраняется в хеш-таблице. Ключ - это строка UA, усеченная.

По умолчанию эта длина ключа составляет 64 символа, поэтому при изменении конца длинной строки UA изменений не наблюдается. Этот параметр управляется свойством UserAgentCacheKeyLength из HttpCapabilitiesDefaultProvider. Для проверки я добавил

<browserCaps userAgentCacheKeyLength="512" />

к элементу <system.web> в Web.config в моем тестовом проекте. Благодаря этому быстрому решению проблема исчезнет.

...