Обнаружение Internet Explorer 11 на стороне сервера

Мы все знаем, что обнаружение IE11 не работает с серверными языками, потому что Microsoft удалила указатель браузера IE/MSIE и теперь полностью "Mozilla".

Я также знаю, что выполнение/версия браузера является рискованной, но в прошлом она хорошо служила всем нам.

Некоторые требования к веб-сайту:

должен работать с определенной версией firefox и выше должен работать с определенной версией хром и выше должен работать с определенной версией сафари (некоторые ниже и некоторые новые) должен работать с IE >= 8

так вот проблема... IE11 указывает в моем списке, что он не поддерживается. Я хочу поддержать его с веб-страницы вещей на сервере (ASP.NET/MVC)

неясно, как это обнаружить со стороны сервера. Кто-нибудь знает, как?

это пользовательский агент, который теперь отображается в IE 11:

"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv: 11.0), как Gecko"

rv: 11.0 сообщает, что его IE11, однако, делает синтаксический разбор, это все равно означает, что, например, это может быть хром определенной версии, которая не поддерживается в таком требовании или даже firefox.

Итак, что лучший способ узнать, действительно ли это IE 11 или выше?

Я не уверен в поиске с "Trident" и далее, потому что я не знаю, используют ли другие браузеры или нет.

приветствуется любое направление.

Ответ 1

Я решил это, используя нижеприведенное Regex после того, как система выбивки проверила, какой браузер используется для доступа к сайту.

в этом случае, даже если браузер "IE" проверен и возвращает false, я продолжаю использовать это регулярное выражение и проверяю, соответствует ли он пользовательскому агенту:

(?:\b(MS)?IE\s+|\bTrident\/7\.0;.*\s+rv:)(\d+)

Надеюсь, это поможет кому-то. Я тестировал его и отлично работал. Я также изменил rv на 12 и выше, и он отлично работает в случае, если в IE12 они меняют rv на 12.

Ответ 2

Используйте регулярное выражение, например:

Regex.IsMatch(this.Request.UserAgent, @"Trident/7.*rv:11")

Trident - это имя используемого IE механизма рендеринга. Некоторые другие приложения также используют движок Trident, как вы можете видеть в статье в Википедии. Но это не должно быть проблемой для поиска Trident в User Agent, поскольку никакие другие основные браузеры не используют Trident.

Только IE11 использует Trident версии 7, поэтому, если вы ищете Trident/7 с регулярным выражением, он должен найти IE11.

Ответ 3

Чтобы поддерживать совместимость с существующим кодом, я создал настраиваемый поставщик, поэтому Request.Browser вернет информацию, как ожидалось. Например, Browser.Browser будет "IE", а не "InternetExplorer", который является новым значением после установки исправления.

Кроме того, этот подход возвращает фактическую версию IE, а не версию 7, когда отображается совместимость. Обратите внимание, что Browser.Type вернет "IE7" при просмотре совместимости в случае, если вам нужно его обнаружить, или вы можете легко изменить настраиваемый поставщик, чтобы изменить .Type также.

Подход прост. Выведите класс из HttpCapabilitiesDefaultProvider и установите BrowserCapabilitiesProvider в экземпляр вашего класса.

В Global.asax.cs:

protected void Application_Start(Object sender, EventArgs e)
{
    ...
    HttpCapabilitiesBase.BrowserCapabilitiesProvider = new CustomerHttpCapabilitiesProvider();
    ...
}

Определите свой класс: ОБНОВЛЕНО ВКЛЮЧИТЬ БРОСЕР MICROSOFT EDGE

public class CustomerHttpCapabilitiesProvider : HttpCapabilitiesDefaultProvider
{
    public override HttpBrowserCapabilities GetBrowserCapabilities(HttpRequest request)
    {
        HttpBrowserCapabilities browser = base.GetBrowserCapabilities(request);

        // Correct for IE 11, which presents itself as Mozilla version 0.0
        string ua = request.UserAgent;

        // Ensure IE by checking for Trident
        // Reports the real IE version, not the compatibility view version. 
        if (!string.IsNullOrEmpty(ua))
        {
            if (ua.Contains(@"Trident"))
            {
                if (!browser.IsBrowser(@"IE"))
                {
                    browser.AddBrowser(@"ie");
                    browser.AddBrowser(@"ie6plus");
                    browser.AddBrowser(@"ie10plus");
                }

                IDictionary caps = browser.Capabilities;
                caps[@"Browser"] = @"IE";

                // Determine browser version
                bool ok = false;
                string majorVersion = null; // convertable to int
                string minorVersion = null; // convertable to double
                Match m = Regex.Match(ua, @"rv:(\d+)\.(\d+)");
                if (m.Success)
                {
                    ok = true;
                    majorVersion = m.Groups[1].Value;
                    minorVersion = m.Groups[2].Value; // typically 0
                }
                else
                {
                    m = Regex.Match(ua, @"Trident/(\d+)\.(\d+)");
                    if (m.Success)
                    {
                        int v;
                        ok = int.TryParse(m.Groups[1].Value, out v);
                        if (ok)
                        {
                            v += 4; // Trident/7 = IE 11, Trident/6 = IE 10, Trident/5 = IE 9, and Trident/4 = IE 8
                            majorVersion = v.ToString(@"d");
                            minorVersion = m.Groups[2].Value; // typically 0
                        }
                    }
                }

                if (ok)
                {
                    caps[@"MajorVersion"] = majorVersion;
                    caps[@"MinorVersion"] = minorVersion;
                    caps[@"Version"] = String.Format(@"{0}.{1}", majorVersion, minorVersion);
                }
            }
            else if (ua.Contains(@"Edge"))
            {
                if (!browser.IsBrowser(@"Edge"))
                {
                    browser.AddBrowser(@"edge");
                }

                IDictionary caps = browser.Capabilities;
                caps[@"Browser"] = @"Edge";

                // Determine browser version
                Match m = Regex.Match(ua, @"Edge/(\d+)\.(\d+)");
                if (m.Success)
                {
                    string majorVersion = m.Groups[1].Value;
                    string minorVersion = m.Groups[2].Value;
                    caps[@"MajorVersion"] = majorVersion;
                    caps[@"MinorVersion"] = minorVersion;
                    caps[@"Version"] = String.Format(@"{0}.{1}", majorVersion, minorVersion);
                }
            }
        }

        return browser;
    }
}

Ответ 4

    public ActionResult Index()
    {
        var browser = this.Request.Browser;
        System.Diagnostics.Trace.WriteLine(browser.Browser); // InternetExplorer
        System.Diagnostics.Trace.WriteLine(browser.MajorVersion); // 11
        return View();
    }

Обратите внимание, что для корректного обнаружения IE11 необходимо установить .NET 4.5 или .NET 4.0 с http://support.microsoft.com/kb/2836939/en-us.

Ответ 5

Звучит похоже, что вы - браузеры с белыми списками, что не очень хорошо. Как правило, вам действительно нужно обнаруживать возможности на стороне клиента. MVC действительно не знает, что это за браузер, объект Request.Browser может дать вам некоторую идею, но это не очень надежно, что имеет место для IE 11. Он сообщает мне версию 11 на моей машине dev, но 7 на моем сервер, который может быть катастрофической ошибкой.

Я создаю Single Pages Applications и придерживаюсь того же подхода, что и Google, только поддерживая только текущую и предыдущую версию браузера. Когда я обнаруживаю устаревший браузер, я сервер, "основной" сайт, который является всего лишь базовым CSS и разметкой, без JavaScript. Это проще, так что процесс разработки намного проще.

В любом случае, как я обнаружил, нужно протестировать текущие версии IE так:

    public static bool IsModernIE() {

        return HttpContext.Current.Request.Browser.Browser == "InternetExplorer";

    }

Это вспомогательный метод HTML. Поэтому в вашем cshtml вы можете использовать тест. В моем контроллере я вызываю отдельные проверки версий. Это, в конечном счете, очень хрупкий способ сделать это. Я в основном рисую линию на песке между современными IE (10/11) и старым IE (9-). Этот тест может быть неактуальным со следующей версией, и я еще не тестировал против Xbox One еще.

У меня есть библиотека, которую я использую, размещенная на GitHub. Я бы назвал его пригодным для использования Alpha прямо сейчас, поэтому возьмите его для этого и бегите с ним, если хотите. Я хочу сделать тесты более настраиваемыми извне и т.д. Вот URL-адрес репозитория, https://github.com/docluv/SPAHelper. Я действительно использую его в своем блоге, http://love2dev.com.