Проблема с производительностью при использовании WCF для отправки сообщений XML SOAP в .NET Framework 4.6

Применяется к
.NET Framework 4.6.2

Проблема

Предположим, что на вашем компьютере выполнено обновление до Microsoft платформа .NET Framework 4.6. При использовании приложения, использующего Windows Communication Framework (WCF) для отправки сообщений XML SOAP, кодирование может занимать немного больше времени. В некоторых случаях это может повлиять на скорость обработки запросов серверным приложением.

Причина

Эта проблема возникает из-за нового JIT-компилятора RyuJIT. В этом компиляторе используются другие оптимизации, чем в устаревшем компиляторе JIT64. Метод в горячем пути кода для кодирования строк в XmlDictionaryWriter не оптимизирован для нового JIT-компилятора, поэтому сгенерированные собственные инструкции выполняются медленнее и дольше. Если сообщение SOAP содержит большое количество строк, подлежащих кодированию, этот более медленный код используется чаще и может повлиять на время кодирования.

Решение

Чтобы обойти эту проблему, настройте приложение таким образом, чтобы отключить использование ngen для сборки System.Runtime.Serialization.dll и использовать устаревший модуль JIT. Для этого можно воспользоваться одним из следующих способов:

  • Установите следующие переменные среды:

    COMPLUS_useLegacyJit=1
    COMPLUS_DisableNativeImageLoadList=System.Runtime.Serialization

  • В реестре создайте один из следующих подразделов:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework
    HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework

    Затем добавьте следующие значения:

    • Имя ключа: useLegacyJit
      Тип: REG_WORD
      Значение: 1
    • Имя раздела: DisableNativeImageLoadList
      Тип: REG_SZ
      Значение: System.Runtime.Serialization
  • Добавьте в файл приложения> следующий текст<. exe.config . Создайте указанные разделы, если их еще нет.<Конфигурация>
              <среда выполнения>
                   <useLegacyJit enabled="1">
                  <disableNativeImageLoad>
                      <assemblyIdentity name="System.Runtime.Serialization" />
                  </disableNativeImageLoad>
               </runtime>
          </конфигурация>

        
Дополнительные сведения об известных проблемах в .NET Framework 4.6 см. в разделе «Известные проблемы в .NET Framework 4.6».

Дополнительные сведения

Дополнительные сведения об изменениях в управлении версиями продуктов и их влиянии на .NET Framework 4.6 см. в статье Совместимость приложений в .NET Framework 4.6.