在 .NET Framework 4.6 中使用 WCF 发送 XML SOAP 消息时的性能问题

应用对象
.NET Framework 4.6.2

症状

假设计算机上已升级到 Microsoft .NET Framework 4.6。 当您使用使用 Windows 通信框架 (WCF) 发送 XML SOAP 消息的应用程序时,编码可能需要稍长的时间。 在某些情况下,这可能会影响服务器应用程序处理请求的速率。

原因

出现此问题的原因是名为 RyuJIT 的新实时 (JIT) 编译器。 此编译器使用不同于旧版 JIT64 编译器的优化。 在 XmlDictionaryWriter 中用于编码字符串的热代码路径上的方法未针对新的 JIT 编译器进行优化,并且生成的本机指令运行速度变慢,编码时间更长。 当 SOAP 消息包含大量要编码的字符串时,会更频繁地使用此较慢的代码,并且可能会影响编码时间。

解决方法

要解决此问题,请将应用程序配置为禁止对 System.Runtime.Serialization.dll 程序集使用 ngen,并使用旧的 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
  • 将以下文本 <添加到 app>.exe.config 文件中。 创建指示的部分(如果尚不存在)。<配置>
              <运行时>
                   <useLegacyJit enabled=“1”>
                  <disableNativeImageLoad>
                      <assemblyIdentity name=“System.Runtime.Serialization” />
                  </disableNativeImageLoad>
               </runtime>
          </configuration>

        
有关 .NET Framework 4.6 中已知问题的更多信息,请参阅 .NET Framework 4.6 的已知问题

详细信息

有关 .NET Framework 4.6 中的产品版本控制更改及其影响的详细信息,请参阅 .NET Framework 4.6 中的应用程序兼容性