SqlClient 中的 AppContext 开关
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”设置为 true
或 false
:
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);