ASP.Net 4.0, JavaScript не выводится в IE 11

В нашем проекте ASP.Net 4.0 мы замечаем, что только в IE 11 (как на Windows 7 SP1, так и на Windows 8.1) некоторая JavaScript не выводится ASP.Net.

Например, в IE 10 и ниже, мы видим следующее:

<select name="ctl00$ctl00$cpHeading$cpHeading$ucWebStoreHeader$lshSubjectHeader$ddlVersionList" onchange="javascript:setTimeout(&#39;__doPostBack(\&#39;ctl00$ctl00$cpHeading$cpHeading$ucWebStoreHeader$lshSubjectHeader$ddlVersionList\&#39;,\&#39;\&#39;)&#39;, 0)" id="ctl00_ctl00_cpHeading_cpHeading_ucWebStoreHeader_lshSubjectHeader_ddlVersionList">

Пока в IE 11:

<select name="ctl00$ctl00$cpHeading$cpHeading$ucWebStoreHeader$lshSubjectHeader$ddlVersionList" id="ctl00_ctl00_cpHeading_cpHeading_ucWebStoreHeader_lshSubjectHeader_ddlVersionList">

Мы устанавливаем этот script, используя:

Page.ClientScript.RegisterClientScriptBlock(GetType(), null, script, true);

Может ли это быть из-за того, что .Net 4.0 не обновил файлы определения браузера, чтобы распознать IE 11 со своей строкой пользовательского агента "MSIE"?

Я пошел с этим предположением и попробовал предложение Scott Hanselman об установке KB2836939 как на Win 7 SP1, так и на Win Server 2008 R2 на машине, на которой размещена веб-страница приложение, но я не замечаю обновления для любых файлов .browser в C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\Browsers или C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\браузеры.

Итак, я создал свой собственный файл .browser, разместил его в папках выше и AppBrowsers без везения (побежал aspnet_regbrowsers –i and iisreset). Сохраняет содержимое файла IE11.browser, который я разместил в папках:

<browsers>
<browser id="IE11" parentID="Mozilla">
<identification>
    <userAgent match="Trident/(?'layoutVersion'[7-9]|0*[1-9]\d+)(\.\d+)?;(.*;)?\s*rv:(?'version'(?'major'\d+)(\.(?'minor'\d+)))" />
    <userAgent nonMatch="IEMobile" />
    <userAgent nonMatch="MSIE" />
</identification>    
<capabilities>
    <capability name="browser"              value="IE" />
    <capability name="layoutEngine"         value="Trident" />
    <capability name="layoutEngineVersion"  value="${layoutVersion}" />
    <capability name="extra"                value="${extra}" />
    <capability name="isColor"              value="true" />
    <capability name="majorversion"         value="${major}" />
    <capability name="minorversion"         value="${minor}" />
    <capability name="screenBitDepth"       value="8" />
    <capability name="type"                 value="IE${major}" />
    <capability name="version"              value="${version}" />
    <capability name="ecmascriptversion"    value="3.0" />
    <capability name="jscriptversion"                       value="6.0" />
    <capability name="javascript"           value="true" />
    <capability name="javascriptversion"    value="1.5" />
    <capability name="msdomversion"         value="${majorversion}.${minorversion}" />
    <capability name="w3cdomversion"        value="1.0" />
    <capability name="ExchangeOmaSupported" value="true" />
    <capability name="activexcontrols"      value="true" />
    <capability name="backgroundsounds"     value="true" />
    <capability name="cookies"              value="true" />
    <capability name="frames"               value="true" />
    <capability name="javaapplets"          value="true" />
    <capability name="supportsCallback"     value="true" />
    <capability name="supportsFileUpload"   value="true" />
    <capability name="supportsMultilineTextBoxDisplay" value="true" />
    <capability name="supportsMaintainScrollPositionOnPostback" value="true" />
    <capability name="supportsVCard"        value="true" />
    <capability name="supportsXmlHttp"      value="true" />
    <capability name="tables"               value="true" />
    <capability name="supportsAccessKeyAttribute"    value="true" />
    <capability name="tagwriter"            value="System.Web.UI.HtmlTextWriter" />
    <capability name="vbscript"             value="true" />
</capabilities>
</browser>
</browsers>

Я на правильном пути, думая, что недостающий JavaScript связан с тем, что IE 11 не распознается .NET 4.0? Если да, то почему мой .browser не действует?

Все время и помощь очень ценятся.

Ответ 1

Установка .NET 4.5 на веб-сервере решила проблему (без использования веб-приложения, использующего 4.5). Вот почему я считаю, что 4.5 сделал трюк.

IE 11 имеет строку пользовательского агента (UA), которая не содержит "MSIE", в отличие от всех предыдущих версий IE. IE 11 имеет строку UA:

Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko

IE 10 (и ниже) имеют строки UA, такие как:

Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)

Определение браузера, предназначенное для распознавания различных версий IE (ie.browser под c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\Browsers), выглядит специально для "MSIE" в строке UA, добавляя Возможность использования JavaScript на основе версии IE. В IE 11 совпадение не найдено в ie.browser, вместо этого совпадение встречается в generic.browser(). В .Net 4.0, generic.browser отключает JavaScript, а в версии 4.5 он включен, разрешая нашу проблему.

Я не знаю, зачем вручную редактировать любой из файлов .browser, а затем запустить aspnet_regbrowsers –i and iisreset не выполняет то же самое.

Ответ 2

@Adhooo прав, говоря, что .Net 4.5 недоступен для серверов Windows 2003, поэтому, если вы используете Windows 2003 Server для размещения вашего сайта, изменение на 2008 Server не является опцией "ночь".

Честно говоря, для нас обновление до .Net 4.5 на нашем сервере 2008 года - это не ночной вариант, и на самом деле это не то, что мы можем сделать в течение следующих нескольких месяцев, из-за необходимости проведения различного тестирования, прежде чем способный использовать 4.5 на наших производственных серверах.

Но нам все еще нужно было решить эту проблему для наших посетителей на нашем сайте.

Вот то, что мы обнаружили, нам нужно было сделать, чтобы исправить эту проблему и купить нам некоторое время, прежде чем мы сможем в конечном итоге устранить эту проблему, следуя рекомендациям Microsoft о получении 4.5:

  • Файл обозревателя - мы также изменили файл браузера, чтобы проинструктировать .NET Framework о том, как реагировать на использование IE11.
  • Microsoft Patch - мы установили патч (http://support.microsoft.com/kb/2836939/en-us) и перезагрузились.
  • Зарегистрируйте новые модификации браузера - из командной строки, выполнив следующую строку:

    c:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regbrowsers.exe -i

  • Reset IIS - это необходимо сделать, чтобы IIS затем взял изменения в файлы:

    IISReset

Мы были тогда в позиции, благодаря которой наш сайт можно было использовать в IE11 и после столь необходимого QA Testing, тогда мы смогли использовать наших посетителей на веб-сайте в производственной среде.

Но учтите, что если вы играете с процессом и должны повторно применять файлы браузера к серверу, тогда вы должны использовать флаг удаления aspnet_regbrowsers.exe -u для деинсталляции файлов до вы повторно применяете их. Кроме того, в нашем случае нам также необходимо было повторно применить патч MS, поскольку мы ничего не работали должным образом, пока не сделали.

Да, все немного грязно, но это следует рассматривать как процесс заполнения.

Надеюсь, что это поможет.