Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Van toepassing op: .NET Framework
.NET
Standard
Met de AppContext-klasse kan SqlClient nieuwe functionaliteit bieden terwijl bellers die afhankelijk zijn van het vorige gedrag blijven ondersteunen. Gebruikers kunnen zich afmelden voor een wijziging in het gedrag door specifieke AppContext-switches in te stellen.
MultiSubnetFailover standaard inschakelen
Van toepassing op: .NET Framework; .NET; .NET Standard
(Beschikbaar vanaf versie 7.0)
Als u globaal wilt instellen MultiSubnetFailover=true zonder afzonderlijke verbindingsreeksen te wijzigen, kunt u de AppContext-switch Switch.Microsoft.Data.SqlClient.EnableMultiSubnetFailoverByDefaulttrue instellen op het opstarten van de toepassing:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.EnableMultiSubnetFailoverByDefault", true);
U kunt deze schakeloptie ook inschakelen in uw App.Config:
<runtime>
<AppContextSwitchOverrides value="Switch.Microsoft.Data.SqlClient.EnableMultiSubnetFailoverByDefault=true" />
</runtime>
Wanneer deze optie is ingeschakeld, gedragen alle verbindingen zich alsof MultiSubnetFailover=true is ingesteld in de verbindingsreeks. Deze schakelaar is standaard uitgeschakeld.
Pakket-multiplexing inschakelen voor asynchrone leesbewerkingen
Van toepassing op: .NET Framework; .NET; .NET Standard
(Beschikbaar vanaf versie 7.0)
Pakket-multiplexing verbetert de prestaties voor grote asynchrone leesbewerkingen, zoals ExecuteReaderAsync met grote resultatensets, streamingscenario's of bulksgewijs ophalen van gegevens. Deze functie wordt beheerd door twee opt-in AppContext-switches. Als beide schakelaars op false worden ingesteld, wordt het nieuwe asynchrone verwerkingspad ingeschakeld.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseCompatibilityAsyncBehaviour", false);
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseCompatibilityProcessSni", false);
Standaard zijn beide switches true, waardoor het compatibele bestaande gedrag behouden blijft.
Functie-extensie voor gebruikersagent inschakelen
Van toepassing op: .NET Framework; .NET; .NET Standard
(Beschikbaar vanaf versie 7.0)
Wanneer de AppContext-switch Switch.Microsoft.Data.SqlClient.EnableUserAgent is ingeschakeld, verzendt het stuurprogramma de gegevens van de gebruikersagent naar de server als onderdeel van de verbinding. Deze informatie helpt bij het oplossen van problemen en het kwantificeren van het gebruik van stuurprogramma's per versie en besturingssysteem. Deze schakelaar is standaard uitgeschakeld. Als u dit wilt inschakelen, stelt u de AppContext-switch true in bij het opstarten van de toepassing:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.EnableUserAgent", true);
De decimaaltruncatie inschakelen
Van toepassing op: .NET Framework; .NET; .NET Standard
Vanaf Microsoft.Data.SqlClient 2.0 worden decimale gegevens standaard afgerond, zoals wordt gedaan door SQL Server. Als u het vorige gedrag van afkapping wilt inschakelen, kunt u de AppContext-switch Switch.Microsoft.Data.SqlClient.TruncateScaledDecimaltrue instellen op bij het opstarten van de toepassing:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.TruncateScaledDecimal", true);
Beheerde netwerken inschakelen in Windows
Van toepassing op: .NET; .NET Standard
(Beschikbaar vanaf versie 2.0)
In Windows maakt SqlClient standaard gebruik van een systeemeigen implementatie van de SNI-netwerkinterface. Als u het gebruik van een beheerde SNI-implementatie wilt inschakelen, kunt u de AppContext-switch Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindowstrue instellen op bij het opstarten van de toepassing:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", true);
Met deze schakeloptie schakelt u het gedrag van het stuurprogramma in om een beheerde netwerk implementatie te gebruiken in .NET Core 2.1+ en .NET Standard 2.0+-projecten in Windows, waardoor alle afhankelijkheden van systeemeigen bibliotheken voor de Microsoft.Data.SqlClient-bibliotheek worden geëlimineerd. Het is alleen bedoeld voor test- en foutopsporingsdoeleinden.
Opmerking
Er zijn enkele bekende verschillen in vergelijking met de systeemeigen implementatie. De beheerde implementatie biedt bijvoorbeeld geen ondersteuning voor Windows-verificatie zonder domein.
Transparante NETWERK-IP-resolutie uitschakelen
Van toepassing op: .NET Framework
Transparent Network IP Resolution (TNIR) is een revisie van de bestaande MultiSubnetFailover-functie. TNIR is van invloed op de verbindingsreeks van het stuurprogramma in het geval dat het eerste opgeloste IP-adres van de hostnaam niet reageert en er meerdere IP-adressen zijn gekoppeld aan de hostnaam. De combinatie van TransparentNetworkIPResolution en MultiSubnetFailover selecteert de verbindingsreeks:
| TransparentNetworkIPResolution | MultiSubnetFailover | Verbindingsreeks |
|---|---|---|
| Klopt | Klopt |
TransparentNetworkIPResolution wordt genegeerd. De driver probeert de DNS-opgeloste IP-adressen parallel en voltooit de authenticatie met de eerste hulpverlener. |
| Klopt | Onwaar | De driver voert meerdere verbindingsrondes uit over de DNS-opgeloste IP-adressen, met een minimum van 500 milliseconden bij de eerste poging en steeds grotere time-outs per poging, totdat een verbinding slaagt of de totale Connect Timeout verbinding wordt bereikt. |
| Onwaar | Klopt | De driver probeert de DNS-opgeloste IP-adressen parallel en voltooit de authenticatie met de eerste hulpverlener. |
| Onwaar | Onwaar | De driver probeert elk DNS-opgelost IP-adres achtereenvolgens te vinden totdat er één slaagt of Connect Timeout wordt bereikt. |
TransparentNetworkIPResolutionis standaard ingeschakeld op .NET Framework en MultiSubnetFailover is standaard uitgeschakeld. Op .NET 5 en latere versies TransparentNetworkIPResolution is geen erkend verbindingsstring-trefwoord en het instellen ervan (met elke waarde) gooit ArgumentException (KeywordNotSupported). Die versies zijn alleen eerbiedig MultiSubnetFailover . De rest van dit gedeelte (de automatische override, de faalmodi in de volgende waarschuwing, en de AppContext-schakelaar) geldt voor .NET Framework.
Tip
Ingesteld MultiSubnetFailover=True op elke verbindingsreeks, ongeacht de .NET-versie of of het doel Azure SQL of on-premises SQL Server is.
MultiSubnetFailover=True kiest een parallel-connect codepad dat snel de eerste responsieve replica vindt. Op het .NET Framework omzeilt het ook de sequentiële per-IP herhalingslus van TNIR, wat een veelvoorkomende oorzaak is van lange verbindingsvertragingen en pre-authenticatie handshake-timeouts.
Op .NET Framework, wanneer TransparentNetworkIPResolution niet is gespecificeerd in de verbindingsreeks, schakelt de driver TNIR automatisch uit wanneer de databron een herkend Azure SQL-endpoint is, wanneer de Authentication sleutel wordt ingesteld op een Microsoft Entra ID-methode (Active Directory Password, Active Directory Integrated, Active Directory Interactive, Active Directory Service Principal, Active Directory Device Code Flow, Active Directory Managed IdentityActive Directory DefaultActive Directory MSIof Active Directory Workload Identity), of wanneer de SqlConnection.AccessToken eigenschap is ingesteld. Voor de eindpunten die de driver herkent, zie de TransparentNetworkIPResolution vermelding in SqlConnection.ConnectionString.
Een expliciete TransparentNetworkIPResolution waarde omzeilt dit automatische gedrag: True activeert TNIR en False schakelt TNIR onvoorwaardelijk uit. Om het automatische gedrag te herstellen, verwijder je het trefwoord uit de verbindingsreeks. De automatische override-regel geldt ook niet wanneer de verbindingsreeks naar Azure SQL wijst via een aangepaste CNAME- of vanity DNS-naam waarvan het achtervoegsel niet wordt herkend als een Azure SQL-endpoint. De automatische override-versie richt zich specifiek op Azure SQL; het activeert niet voor on-premises SQL Server, dus TNIR staat daar standaard aan.
Lange verbindingsvertragingen op .NET Framework
Op het .NET Framework TransparentNetworkIPResolution=True kan (de standaard) lange verbindingsvertragingen en pre-authenticatie handshake-timeouts veroorzaken wanneer de doel-DNS-naam naar meerdere IP's wordt omgezet en een van de eerdere IP's ongezond, verouderd of onbereikbaar is. TNIR probeert de opgeloste IP's achtereenvolgens en verhoogt de time-out per poging elke ronde totdat de overall Connect Timeout is bereikt. Je ziet meestal een onverwacht lange verbindingsvertraging die eindigt in deze foutmelding:
Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-authentication handshake acknowledgement. This could be because the pre-authentication handshake failed or the server was unable to respond back in time.
Het patroon komt voor in verschillende topologieën:
- Azure SQL Database, Azure SQL Managed Instance, of SQL database in Microsoft Fabric. De Azure SQL-gateway stuurt elke authenticatie naar een backend-replica. Wanneer een geroutede verbinding faalt, probeert TNIR opnieuw de geroutede backend zonder terug te keren naar de gateway om te worden omgeleid, wat de vertraging tijdens een backend-failover verlengt.
- On-premises SQL Server achter een Always On beschikbaarheidsgroep-luisteraar waarvan de DNS-naam naar meerdere replica-IP's wordt omgezet. Een verouderde DNS-invoer of een ongezond replica-IP wordt sequentieel geprobeerd voordat TNIR een werkende replica bereikt.
-
Failover-clusterinstanties met een multi-subnet cluster listener, of elke andere configuratie waarbij de doel-DNS-naam meerdere
A/AAAArecords heeft (zoals DNS round-robin).
Om dit gedrag te vermijden, stel MultiSubnetFailover=True je in de verbindingsreeks:
MultiSubnetFailover=True
Deze aanbeveling werkt op elke .NET-versie en omvat zowel Azure SQL als on-premises SQL Server. Wanneer MultiSubnetFailover=True, negeert TransparentNetworkIPResolutionde driver , probeert de DNS-opgeloste IP-adressen parallel en voltooit authenticatie met de eerste responsieve replica. Ondanks de naam MultiSubnetFailover geldt het voor elke luisteraar wiens DNS-naam naar meerdere doel-IP's wordt omgelost, ongeacht of die IP's zich in verschillende subnetten bevinden, en het is veilig op standalone servers waarvan de DNS op één IP wordt opgelost.
Voor procesbrede controle zonder elke verbindingsreeks te bewerken, gebruik de standaard AppContext-switch Enable MultiSubnetFailover.
Schakel TNIR uit met een AppContext-schakelaar
Om de standaardwaarde van TransparentNetworkIPResolution van naar falsetrue te zetten in .NET Framework, zet je de AppContext-schakelaar Switch.Microsoft.Data.SqlClient.DisableTNIRByDefaultInConnectionString op true bij applicatieopstart. Deze switch verandert alleen de standaardwaarde als TransparentNetworkIPResolution hij niet in de verbindingsreeks zit; hij overschrijft geen expliciete waarde.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.DisableTNIRByDefaultInConnectionString", true);
Zie de documentatie voor de eigenschap SqlConnection.ConnectionString voor meer informatie over het instellen van deze eigenschappen.
Een minimale time-out inschakelen tijdens het aanmelden
Van toepassing op: .NET Framework; .NET; .NET Standard
Als u wilt voorkomen dat een aanmeldingspoging voor onbepaalde tijd wacht, kunt u de AppContext-switch Switch.Microsoft.Data.SqlClient.UseOneSecFloorInTimeoutCalculationDuringLogintrue instellen op het opstarten van de toepassing:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseOneSecFloorInTimeoutCalculationDuringLogin", false);
Blokkerend gedrag van ReadAsync uitschakelen
Van toepassing op: .NET Framework; .NET; .NET Standard
Vanaf versie 3.0 wordt ReadAsync asynchroon uitgevoerd. In eerdere versies wordt ReadAsync synchroon uitgevoerd en wordt de aanroepende thread op .NET Framework geblokkeerd. Als u dit blokkerende gedrag wilt beheren, kunt u de AppContext-switch Switch.Microsoft.Data.SqlClient.MakeReadAsyncBlocking instellen op true of false bij het opstarten van de toepassing:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.MakeReadAsyncBlocking", false);
Null-gedrag voor rowversion activeren
Van toepassing op: .NET Framework; .NET; .NET Standard
Vanaf versie 3.0 retourneert SqlDataReader een DBNull-waarde wanneer een rijversie de waarde null heeft, in plaats van een lege byte[]. Als u het verouderde gedrag van het retourneren van een lege byte[] wilt inschakelen, schakelt u bij het opstarten van de applicatie de AppContext-switch Switch.Microsoft.Data.SqlClient.LegacyRowVersionNullBehavior in.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.LegacyRowVersionNullBehavior", true);
Onveilige TLS-waarschuwing onderdrukken
Van toepassing op: .NET Framework; .NET; .NET Standard
(Beschikbaar vanaf versie 4.0.1)
Wanneer u in de verbindingsreeks gebruikt Encrypt=false , wordt er een beveiligingswaarschuwing naar de console uitgevoerd als de TLS-versie 1.2 of lager is. Deze waarschuwing kan worden onderdrukt door de volgende AppContext-switch in te schakelen bij het opstarten van de toepassing:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.SuppressInsecureTLSWarning", true);
Servergespecificeerde failoverpartner negeren
Van toepassing op: .NET Framework; .NET; .NET Standard
(Beschikbaar vanaf versie 5.1.8, 6.0.4 en 6.1.3)
Bij een failover heeft de door de server verstrekte informatie over de failoverpartner de voorkeur boven de door de verbindingsreeks verstrekte informatie over de failoverpartner. Schakel deze AppContext-switch in bij het opstarten van de toepassing om informatie van de failoverpartner die is opgegeven door de server te negeren en alleen de informatie van de verbindingsreeks te gebruiken.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.IgnoreServerProvidedFailoverPartner", true);