2013-11-15 4 views
17

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

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

некоторых требования для веба-сайта являются такими вещами, как:

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

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

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

это агент пользователя теперь показано в IE 11:

"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; с.в.: 11,0), как Gecko"

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

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

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

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

+4

Мне кажется, что проблема существует, потому что вы Whitelisting поддерживаются браузеры вместо черного списка неподдерживаемых. Вы сами указываете, как это может сломаться: вы не можете белыми списками будущих браузеров, потому что они еще не существуют. Тем не менее, вы * можете * черный список неподдерживаемых браузеров, потому что это все в прошлом. Вы считали это? – Jon

+0

Согласен с вами Джон. Это займет немного времени, но позвольте мне посмотреть, что я могу сделать. –

+0

@Jon - пересматривая код и примечания, кажется, что есть другие браузеры, которые мы просто не поддерживаем, например, как netscape или мобильные устройства вообще или опера или netscape .... так как это можно обрабатывать, t иметь эти браузеры, чтобы проверить, что будет сообщено, и отклонить их? –

ответ

8

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

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

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

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

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

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

+0

работает .NET Framework 4.5. У меня также есть .NET Framework 4.0, но сайт находится в браузере .NET Framework 4.5. Отчеты браузера «Mozilla» и MajorVersion равны 0. –

+0

вам нужно 4.5 или 4.0 с исправлением на стороне сервера. mozilla/0 означает, что исправление не установлено. попробуйте установить исправление. если сайт предварительно скомпилирован, вам также понадобится 4.5/hotfix на машине, используемой для предварительной компиляции. – PashaPash

+0

спасибо. Проблема в том, что установка исправлений при производстве - это долгий длительный процесс, и его нужно тестировать несколько недель подряд до того, как будет указан зеленый свет. –

13

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

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

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

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

+0

Спасибо. Я закончил делать что-то вроде этого и работает (используя регулярное выражение). Я решил не использовать метод исправления, предложенный @pashapash, потому что для установки исправлений на производстве нужно пройти долгий длительный процесс. –

-2

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

Я строю отдельные страницы приложений и принял аналогичное отношение к 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.

+0

некоторые говорят, что я белый список, другие говорят, что я черный список ... ну, что же делать? У нас есть набор требований, и я слежу за ними. :) Требования заключаются в том, что * некоторые * браузеры одобрены, а другие - не так, если только они не имеют определенной версии. так что, к сожалению, так оно и есть. Также ваш метод IsModernIE() завершится с IE11 и выше. Браузер теперь сообщается как Mozilla, а не MSIE, IE или InternetExplorer. Обнаружение на стороне клиента недостаточно для того, что нужно сделать ... –

+0

Нет, это не работает, я использую его на своих сайтах, например, http://love2dev.com. –

+1

Без системного исправления для исправления файлов браузера IE11 определяется как Mozilla. С исправлением IE11 обнаруживается как «InternetExplorer», в отличие от указанного для более ранних версий IE («IE»). –

13

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

Кроме того, этот подход возвращает фактическую версию IE, а не версию 7 в режиме совместимости. Обратите внимание, что вернет «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; 
    } 
} 
+2

Спасибо Doug - отличное решение для обеспечения совместимости с существующим кодом! –

+0

это работает только для .NET 4.0+ – Dbl

+0

Любое обновление для Edge? –

Смежные вопросы