SqlClient 中的 AppContext 开关

下载 ADO.NET

AppContext 类允许 SqlClient 提供新的功能,同时继续支持依赖于先前行为的调用方。 用户可通过设置特定的 AppContext 开关来选择退出一种行为更改。

强制使用操作系统加密协议

适用于: .NET Framework .NET .NET Standard

从 Microsoft.Data.SqlClient 4.0 开始,TLS 1.3 不再受驱动程序支持,且默认已从支持的协议列表中删除。 用户可以通过将 AppContext 开关“Switch.Microsoft.Data.SqlClient.UseSystemDefaultSecureProtocols”设置为 true,切换回强制使用操作系统的客户端协议:

AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseSystemDefaultSecureProtocols", true);

从版本 5.0 开始,TDS 8 连接中支持 TLS 1.3,无需使用上述开关。 Encrypt 设置为 Strict 时启用 TDS 8。

启用小数截断行为

适用于: .NET Framework .NET .NET Standard

从 Microsoft.Data.SqlClient 2.0 开始,与 SQL Server 一样,小数数据默认四舍五入。 若要启用之前的截断行为,可在应用程序启动时将 AppContext 开关“Switch.Microsoft.Data.SqlClient.TruncateScaledDecimal”设置为 true

AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.TruncateScaledDecimal", true);

在 Windows 上启用托管网络

适用于: 不支持。 .NET Framework .NET Core .NET Standard

(仅从版本 2.0 开始可用)

在 Windows 上,SqlClient 默认使用 SNI 网络接口的本机实现。 若要支持使用托管 SNI 实现,可在应用程序启动时将 AppContext 开关“Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows”设置为 true

AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", true);

此开关会切换驱动程序的行为,以便在 Windows 上的 .NET Core 2.1+ 和 .NET Standard 2.0+ 项目中使用托管的网络实现,从而消除对 Microsoft.Data.SqlClient 库的本机库的所有依赖项。 仅用于测试和调试目的。

注意

与本机实现相比,两者存在一些已知的差异。 例如,托管实现不支持非域 Windows 身份验证。

禁用透明网络 IP 解析

适用于: .NET Framework 不支持。 .NET Core 不支持。 .NET Standard

透明网络 IP 解析 (TNIR) 是对现有 MultiSubnetFailover 功能的修订。 如果第一个解析的主机名 IP 未响应,且存在多个与主机名关联的 IP,TNIR 就会影响驱动程序的连接序列。 TNIR 与 MultiSubnetFailover 交互,以提供下列三个连接序列:

  • 0:先尝试一个 IP,再并行尝试所有 IP
  • 1:并行尝试所有 IP
  • 2:逐一尝试所有 IP
TransparentNetworkIPResolution MultiSubnetFailover 行为
True True 1
正确 False 0
False True 1
False False 2

TransparentNetworkIPResolution 默认处于启用状态。 MultiSubnetFailover 默认处于禁用状态。 若要禁用 TNIR,可在应用程序启动时将 AppContext 开关“Switch.Microsoft.Data.SqlClient.DisableTNIRByDefaultInConnectionString”设置为 true

AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.DisableTNIRByDefaultInConnectionString", true);

有关设置这些属性的详细信息,请参阅 SqlConnection.ConnectionString 属性文档。

在登录期间启用最小超时

适用于: .NET Framework .NET .NET Standard

若要防止登录尝试无限期等待,可在应用程序启动时将 AppContext 开关“Switch.Microsoft.Data.SqlClient.UseOneSecFloorInTimeoutCalculationDuringLogin”设置为 true

AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseOneSecFloorInTimeoutCalculationDuringLogin", false);

禁用 ReadAsync 的阻止行为

适用于: .NET Framework .NET .NET Standard

从版本 3.0 开始,ReadAsync 以异步方式运行。 以前的版本以同步方式运行 ReadAsync,并阻止 .NET Framework 上的调用线程。 若要控制此阻止行为,可在应用程序启动时将 AppContext 开关“Switch.Microsoft.Data.SqlClient.MakeReadAsyncBlocking”设置为 truefalse

AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.MakeReadAsyncBlocking", false);

启用可配置的重试逻辑

适用于: .NET Framework .NET .NET Standard

(仅从版本 3.0 开始可用)

默认情况下,可配置的重试逻辑处于禁用状态。 若要启用此功能,可在应用程序启动时将 AppContext 开关“Switch.Microsoft.Data.SqlClient.EnableRetryLogic”设置为 true。 即使向连接或命令分配了重试提供程序,也需要此开关。

AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.EnableRetryLogic", true);

注意

从 Microsoft.Data.SqlClient v4.0 开始,使用可配置的重试逻辑功能时,不再需要应用上下文开关“Switch.Microsoft.Data.SqlClient.EnableRetryLogic”。 生产环境中现在支持该功能。 此功能的默认行为将继续为非重试策略,需要由客户端应用程序重写该策略才能启用重试。

启用行版本 null 行为

适用于: .NET Framework .NET .NET Standard

从版本 3.0 开始,当行版本的值为 null 时,SqlDataReader 会返回 DBNull 值而不是空的 byte[]。 要启用返回 byte[] 的旧版行为,请在应用程序启动时启用 AppContext 开关 Switch.Microsoft.Data.SqlClient.LegacyRowVersionNullBehavior。

AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.LegacyRowVersionNullBehavior", true);

禁止显示不安全的 TLS 警告

适用于: .NET Framework .NET .NET Standard

(从版本 4.0.1 开始可用)

在连接字符串中使用 Encrypt=false 时,如果 TLS 版本为 1.2 或更低版本,则安全警告将输出到控制台。 可以通过在应用程序启动时启用以下 AppContext 开关来禁止显示此警告:

AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.SuppressInsecureTLSWarning", true);

另请参阅

AppContext 类