Веб-сайт .Net 4.0 не может идентифицировать некоторые браузеры на основе AppleWebKit - PullRequest
15 голосов
/ 29 марта 2011

Мы видим, что некоторым браузерам Safari не удается выполнить перекрестную аутентификацию нашего веб-сайта после обновления до .NET 4.0 с .NET 3.5.

После многих исследований выяснилось, что ASP.NET правильно идентифицирует браузеры Safari.ASP.NET идентифицирует некоторые Safari (возможно, другие браузеры на основе WebKit) как Mozilla версии 0.0.браузеры, которые не поддерживают файлы cookie, фреймы, JavaScript и т. д. В NET 3.5 не возникает проблем при идентификации этих браузеров.

Мы упростили тестирование до простого обработчика HTTP (работающего на веб-сайте vanilla 4.0), которыйвозвращает только возможности браузера запрашивающей стороны.

Вот несколько пользовательских агентов, которые не могут быть идентифицированы (они определены как Mozilla 0.0):

  • Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10_5_8;+en-us)+AppleWebKit/533.19.4+(KHTML,+like+Gecko)+Version/5.0.3+Safari/533.19.4
  • Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10_6_2;+en-us)+AppleWebKit/531.9+(KHTML,+like+Gecko)
  • Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10_6_7;+en-us)+AppleWebKit/533.20.25+(KHTML,+like+Gecko)+Version/5.0.4+Safari/533.20.27
  • Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10_6_6;+en-us)+AppleWebKit/533.18.1+(KHTML,+like+Gecko)

Код обработчика выглядит следующим образом:

<%@ WebHandler Language="C#" Class="PowershellTemporaryHandler" %>

using System;
using System.Web;
using System.Web.Security;

public class PowershellTemporaryHandler : IHttpHandler
{
    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {        
        HttpBrowserCapabilities hbc = context.Request.Browser;
        context.Response.Write("Type=" + hbc.Type + "<br>");
        context.Response.Write("Name=" + hbc.Browser + "<br>");
        context.Response.Write("Version=" + hbc.Version + "<br>");
        context.Response.Write("Major Version=" + hbc.MajorVersion + "<br>");
        context.Response.Write("Minor Version=" + hbc.MinorVersion + "<br>");
        context.Response.Write("Platform=" + hbc.Platform + "<br>");
        context.Response.Write("Is Beta=" + hbc.Beta + "<br>");
        context.Response.Write("Is Crawler=" + hbc.Crawler + "<br>");
        context.Response.Write("Is AOL=" + hbc.AOL + "<br>");
        context.Response.Write("Is Win16=" + hbc.Win16 + "<br>");
        context.Response.Write("Is Win32=" + hbc.Win32 + "<br>");
        context.Response.Write("Supports Tables=" + hbc.Tables + "<br>");
        context.Response.Write("Supports cookies=" + hbc.Cookies + "<br>");
        context.Response.Write("Supports VBScript=" + hbc.VBScript + "<br>");
        context.Response.Write("Supports Frames=" + hbc.Frames + "<br>");
        context.Response.Write("Supports JavaScript=" + hbc.EcmaScriptVersion.ToString() + "<br>");
        context.Response.Write("Supports Java Applets=" + hbc.JavaApplets + "<br>");
        context.Response.Write("Supports ActiveX Controls=" + hbc.ActiveXControls + "<br>");
        context.Response.Write("User Agent=" + context.Request.UserAgent + "<br>");
    }
}

Мы изумлены отсутствием упоминания в Интернете об этой проблеме.Кажется, нам нужно добавить определения браузера либо в папку framework / config / browsers, либо в папку App_Browsers на уровне веб-сайта, но кажется странным, что для корректной работы веб-сайта .NET 4.0 нам потребуется настроить определения браузера..

У кого-нибудь есть опыт решения этой проблемы?

Ответы [ 4 ]

24 голосов
/ 17 августа 2011

Я столкнулся с чем-то похожим.Похоже, что некоторые пользовательские агенты Safari не распознаются должным образом и вместо этого сообщаются как Mozilla 0.0, НО некоторые исследования показали, что этот сбой не является точно воспроизводимым.Если я использую UserAgent-Switcher моего Firefox для отправки точно такого же пользовательского агента, который ранее не был распознан, и взглянул на возможности браузера, он правильно отображается как Safari.Просмотр файлов журнала сервера (после добавления некоторой отладочной информации) также, кажется, подтверждает это поведение.Тот же самый клиент с тем же (Safari) пользовательским агентом иногда корректно распознается и иногда сообщается как Mozilla 0.0 - большую часть времени он неправильно распознается пару раз подряд, прежде чем он снова получает это правильно ... Это толькопохоже, влияет на пользовательские агенты Safari - если кому-то интересно, у меня есть довольно длинный список, самый последний из которых:

  • | Mozilla / 5.0 (iPhone; U; CPU iPhone OS 4_2_1, как Mac OSX; de-de) AppleWebKit / 533.17.9 (KHTML, как Gecko) Версия / 5.0.2 Mobile / 8C148 Safari / 6533.18.5 |

У кого-нибудь есть больше информации по этому вопросу?


РЕДАКТИРОВАТЬ 2011-08-24

Кажется, я нашел основную причину проблемы.Механизм разрешения UserAgent -> BrowserCaps использует кэш для временного хранения отображений.К сожалению, он использует (по умолчанию) первые 64 символа строки UserAgent в качестве ключа кэша, и это просто BS ... Иногда всплывает пользовательский агент, похожий на Safari, но на самом деле это не так, и он не разрешен должным образом(Mozilla 0.0), но отображение по-прежнему сохраняется в кэше, что означает, что все строки UserAgent с одинаковым префиксом из 64 символов теперь также отображаются неправильно, пока не истечет срок действия записи в этом кэше (скользящее окно с 1 минутой).К счастью, длина ключа, используемая для кэширования, может быть настроена с помощью

<browserCaps userAgentCacheKeyLength="..." />

в разделе конфигурации.Я увеличил длину ключа до 256, и с тех пор проблема исчезла.Теперь я попытаюсь выяснить, какая строка UserAgent была ответственна за отравление кэша в первом месте - и я обновлю этот пост, если найду что-нибудь.

2 голосов
/ 30 января 2013

Решение

Я поместил элемент <browserCaps userAgentCacheKeyLength='256'> в <system.web> и все работает, как показано ниже:

<configuration>
    <system.web>
        <browserCaps userAgentCacheKeyLength="256" />
    </system.web>
</configuration>

Подробное объяснение

Механизм разрешения 'Длина ключа кэша пользовательского агента для браузера' использует кэш для временного хранения отображений.

По умолчанию он использует первые 64 символа строки UserAgent в качестве ключа кэша, однако, когда появляется пользовательский агент, который выглядит так, как будто он принадлежит Safari , но на самом деле не разрешается должным образом, т.е. ' Mozilla 0.0 '

Отображение сохраняется в кеше, что означает, что все строки UserAgent с одинаковым 64 символьным префиксом теперь неправильно отображаются до истечения срока действия записи в кеше, т.е. обычно 1 минут .

Длина ключа, используемого для кэширования, настраивается с использованием следующего:

Увеличьте длину ключа до 256 , чтобы решить проблему.

... У меня были проблемы с поиском правильного места в моем файле web.config для вставки вышеуказанного.

Когда я вставил элемент <browserCaps userAgentCacheKeyLength="..." /> прямо под <configuration> в мой файл web.config , мое веб-приложение сразу же упало.

К счастью, это произошло в тестовой среде, а не в рабочей среде.

После поиска в Интернете я нашел старую справочную страницу MSDN / ASP .NET (http://msdn.microsoft.com/en-us/library/sk9az15a%28v=vs.71%29.aspx), в которой указывалось, что элемент <broswerCaps> является дочерним по отношению к <system.web>.

2 голосов
/ 10 мая 2012

Я перепробовал все ответы из этой темы, но для User Agent с IPhone 4S:

Mozilla / 5.0 (iPhone; U; процессор iPhone OS 4_3, как Mac OS X; де-де) AppleWebKit / 533.17.9 (KHTML, как Gecko) Mobile / 8F190

Это все еще пошло не так. В конце концов я использовал свойство ClientTarget со значением «uplevel», чтобы заставить ASP.NET всегда включать новые функции браузера. Я поместил это в базовый класс, от которого наследуются все страницы.

См .: http://msdn.microsoft.com/en-us/library/system.web.ui.page.clienttarget.aspx

0 голосов
/ 30 марта 2011

Я настоятельно рекомендую вам рассмотреть возможность использования следующего:

http://aspnet.codeplex.com/releases/view/41420

...