Opções de AppContext no SqlClient
A classe AppContext permite que o SqlClient forneça novas funcionalidades enquanto continua dando suporte a chamadores que dependem do comportamento anterior. Os usuários podem recusar alterações no comportamento definindo opções de AppContext específicas.
Exigir o uso de protocolos de criptografia do sistema operacional
Aplicável a: .NET Framework .NET .NET Standard
A partir do Microsoft.Data.SqlClient 4.0, o TLS 1.3 não recebe mais suporte do driver e foi removido da lista de protocolos com suporte por padrão. Os usuários podem voltar para exigir o uso dos protocolos de cliente do sistema operacional, definindo a alternância de contento do aplicativo "Switch.Microsoft.Data.SqlClient.UseSystemDefaultSecureProtocols" como true:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseSystemDefaultSecureProtocols", true);
A partir da versão 5.0, o TLS 1.3 tem suporte em conexões TDS 8 sem precisar usar a opção acima. O TDS 8 está habilitado quando Encrypt
está definido como Strict
.
Habilitar o comportamento de truncamento de decimal
Aplicável a: .NET Framework .NET .NET Standard
Começando com o Microsoft.Data.SqlClient 2.0, os dados decimais são arredondados por padrão, como é feito pelo SQL Server. Para habilitar o comportamento de truncamento anterior, você pode definir a opção de AppContext "Switch.Microsoft.Data.SqlClient.TruncateScaledDecimal" como true
na inicialização do aplicativo:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.TruncateScaledDecimal", true);
Habilitando a rede gerenciada no Windows
Aplica-se a: .NET Framework .NET Core .NET Standard
(Disponível começando com a versão 2.0)
No Windows, o SqlClient usa uma implementação nativa da interface de rede SNI por padrão. Para habilitar o uso de uma implementação de SNI gerenciada, você pode definir a opção de AppContext "Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows" como true
na inicialização do aplicativo:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", true);
Essa opção altera o comportamento do driver para usar a implementação de rede gerenciada em projetos do .NET Core 2.1+ e do .NET Standard 2.0+ no Windows, eliminando todas as dependências de bibliotecas nativas para a biblioteca Microsoft.Data.SqlClient. Sua finalidade é apenas de teste e depuração.
Observação
Há algumas diferenças conhecidas em comparação com a implementação nativa. Por exemplo, a implementação gerenciada não dá suporte à Autenticação do Windows fora do domínio.
Desabilitando a Resolução IP de Rede Transparente
Aplica-se a: .NET Framework .NET Core .NET Standard
A TNIR (Resolução IP de Rede Transparente) é uma revisão do recurso MultiSubnetFailover existente. A TNIR afeta a sequência de conexão do driver quando o primeiro IP resolvido do nome do host não responde e quando existem vários IPs associados ao nome do host. Ela interage com MultiSubnetFailover para fornecer as três seguintes sequências de conexão:
- 0: um IP é tentado, seguido por todos os IPs em paralelo
- 1: todos os IPs são tentados em paralelo
- 2: todos os IPs são tentados um após o outro
TransparentNetworkIPResolution | MultiSubnetFailover | Comportamento |
---|---|---|
True | True | 1 |
True | Falso | 0 |
Falso | True | 1 |
Falso | Falso | 2 |
TransparentNetworkIPResolution é habilitado por padrão. MultiSubnetFailover é desabilitado por padrão. Para desabilitar a TNIR, você pode definir a opção de AppContext "Switch.Microsoft.Data.SqlClient.DisableTNIRByDefaultInConnectionString" como true
na inicialização do aplicativo:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.DisableTNIRByDefaultInConnectionString", true);
Para obter mais informações sobre como definir essas propriedades, confira a documentação da Propriedade SqlConnection.ConnectionString.
Habilitar um tempo limite mínimo durante o logon
Aplicável a: .NET Framework .NET .NET Standard
Para evitar que uma tentativa de logon aguarde indefinidamente, você pode definir a opção de AppContext Switch.Microsoft.Data.SqlClient.UseOneSecFloorInTimeoutCalculationDuringLogin como true
na inicialização do aplicativo:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseOneSecFloorInTimeoutCalculationDuringLogin", false);
Desabilitar o comportamento de bloqueio do ReadAsync
Aplicável a: .NET Framework .NET .NET Standard
A partir da versão 3.0, o ReadAsync é executado de forma assíncrona. As versões anteriores executam ReadAsync de forma síncrona e bloqueiam o thread de chamada em .NET Framework. Para desabilitar esse comportamento de bloqueio, você pode definir a opção de AppContext Switch.Microsoft.Data.SqlClient.MakeReadAsyncBlocking como true
ou false
na inicialização do aplicativo:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.MakeReadAsyncBlocking", false);
Habilitar lógica de repetição configurável
Aplicável a: .NET Framework .NET .NET Standard
(Disponível começando com a versão 3.0)
Por padrão, a lógica de repetição configurável fica desabilitada. Para habilitar esse recurso, defina a opção do AppContext Switch.Microsoft.Data.SqlClient.EnableRetryLogic como true
na inicialização do aplicativo. Essa opção é necessária, mesmo que um provedor de repetição seja atribuído a uma conexão ou a um comando.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.EnableRetryLogic", true);
- Para obter informações sobre como habilitar a opção usando um arquivo de configuração, confira Habilitar a opção de segurança.
Observação
A partir do Microsoft.Data.SqlClient v4.0, a alternância de contexto do aplicativo "Switch.Microsoft.Data.SqlClient.EnableRetryLogic" não será mais necessária para usar o recurso lógico de repetição configurável. Agora há suporte para o recurso na produção. O comportamento padrão do recurso continuará sendo uma política de não nova tentativa, que precisará ser substituído por aplicativos cliente para habilitar as recuperações.
Habilitar o comportamento nulo da versão de linha
Aplicável a: .NET Framework .NET .NET Standard
A partir da versão 3.0, quando uma versão de linha tem um valor nulo, SqlDataReader
retorna um valor DBNull
em vez de um byte[]
vazio. Para habilitar o comportamento herdado de retornar um byte[]
vazio, habilite o seguinte comutador AppContext Switch.Microsoft.Data.SqlClient.LegacyRowVersionNullBehavior na inicialização do aplicativo.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.LegacyRowVersionNullBehavior", true);
Suprimir aviso TLS inseguro
Aplicável a: .NET Framework .NET .NET Standard
(Disponível a partir da versão 4.0.1)
Ao usar Encrypt=false
na cadeia de conexão, um aviso de segurança será apresentado ao console se a versão do TLS for 1.2 ou inferior. Esse aviso pode ser suprimido habilitando o seguinte comutador AppContext na inicialização do aplicativo:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.SuppressInsecureTLSWarning", true);