Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir: .NET Framework
.NET
.NET Standard
AppContext sınıfı, SqlClient'ın önceki davranışa bağımlı arayanları desteklemeye devam ederken yeni işlevler sağlamasına olanak tanır. Kullanıcılar belirli AppContext anahtarları ayarlayarak davranış değişikliğini geri çevirebilir.
SqlClient, her switch'i ilk kullandığında okur ve önbellekler. Anahtarları uygulama başlatıldığında, herhangi bir SqlClient türü kullanmadan önce ayarlayın. SqlClient değerini önbelleğe aldıktan sonra bir ayarı değiştirmek hiçbir etki göstermez.
MultiSubnetFailover'ı varsayılan olarak etkinleştirme
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
(Sürüm 7.0'dan itibaren kullanılabilir)
Bireysel bağlantı dizileri değiştirmeden küresel ayarlamak MultiSubnetFailover=true için, uygulama başlangıcında AppContext anahtarını Switch.Microsoft.Data.SqlClient.EnableMultiSubnetFailoverByDefault şu true şekilde ayarlayın:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.EnableMultiSubnetFailoverByDefault", true);
Bu anahtarı App.Config'inizde de etkinleştirebilirsiniz:
<runtime>
<AppContextSwitchOverrides value="Switch.Microsoft.Data.SqlClient.EnableMultiSubnetFailoverByDefault=true" />
</runtime>
Etkinleştirildiğinde, tüm bağlantılar bağlantı dizesinde ayarlanmış gibi MultiSubnetFailover=true davranır. Bu anahtar varsayılan olarak devre dışıdır.
Zaman uyumsuz okumalar için paket çoğullamayı etkinleştirin
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
(Sürüm 7.0'dan itibaren kullanılabilir)
Paket çoğullama, büyük sonuç kümeleri, akış senaryoları veya toplu veri alma gibi ExecuteReaderAsync büyük zaman uyumsuz okuma işlemleri için performansı artırır. Bu özellik, iki isteğe bağlı AppContext anahtarı tarafından denetlenir. her iki anahtarın false da ayarlanması yeni eşzamansız işlem yolunu etkinleştirir.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseCompatibilityAsyncBehaviour", false);
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseCompatibilityProcessSni", false);
Varsayılan olarak, her iki anahtar da true mevcut (uyumlu) davranışı korur.
Kullanıcı Aracısı özellik uzantısını etkinleştirme
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
(Sürüm 7.0'dan itibaren kullanılabilir)
AppContext anahtarı Switch.Microsoft.Data.SqlClient.EnableUserAgent etkinleştirildiğinde, sürücü bağlantı kapsamında kullanıcı ajanı bilgilerini sunucuya gönderir. Bu bilgiler, sürüme ve işletim sistemine göre sürücü kullanımını gidermeye ve ölçmeye yardımcı olur. Bu anahtar varsayılan olarak devre dışıdır. Bunu etkinleştirmek için uygulama başlangıcında AppContext anahtarını true olarak ayarlayın:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.EnableUserAgent", true);
Ondalık kesme davranışını etkinleştirme
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
Microsoft.Data.SqlClient 2.0'dan başlayarak, SQL Server tarafından yapıldığı gibi ondalık veriler varsayılan olarak yuvarlanr. Önceki kesinti davranışını etkinleştirmek için, uygulama başlangıcında AppContext anahtarını Switch.Microsoft.Data.SqlClient.TruncateScaledDecimal ayarlayabilirsiniz true :
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.TruncateScaledDecimal", true);
Windows'da yönetilen ağı etkinleştirme
Şunlar için geçerlidir: .NET; .NET Standard
(Sürüm 2.0'dan itibaren kullanılabilir)
Windows'da SqlClient varsayılan olarak SNI ağ arabiriminin yerel bir uygulamasını kullanır. Yönetilen bir SNI gerçekleştirmesinin kullanımını etkinleştirmek için, uygulama başlangıcında AppContext anahtarını Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows değerine true olarak ayarlayın:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", true);
Bu anahtar, windows üzerinde .NET Core 2.1+ ve .NET Standard 2.0+ projelerinde yönetilen ağ uygulamasını kullanmak için sürücünün davranışını değiştirir ve Microsoft.Data.SqlClient kitaplığı için yerel kitaplıklardaki tüm bağımlılıkları ortadan kaldırır. Yalnızca test ve hata ayıklama amaçlıdır.
Uyarı
Yerel uygulamayla karşılaştırıldığında bazı bilinen farklılıklar vardır. Örneğin, yönetilen uygulama alan dışı Windows Doğrulamasını desteklemez.
Şeffaf Ağ IP Çözümlemesini Devre Dışı Bırak
Şunlar için geçerlidir: .NET Framework
Saydam Ağ IP Çözümlemesi (TNIR), mevcut MultiSubnetFailover özelliğinin bir düzeltmesidir. Ana bilgisayar adının ilk çözümlenen IP'sinin yanıt vermemesi ve ana bilgisayar adıyla ilişkilendirilmiş birden çok IP olması durumunda TNIR, sürücünün bağlantı sırasını etkiler.
TransparentNetworkIPResolution ve MultiSubnetFailover birleşimi bağlantı dizisini seçer:
| Şeffaf Ağ IP Çözümleme | MultiSubnetFailover | Bağlantı sırası |
|---|---|---|
| Doğru | Doğru |
TransparentNetworkIPResolution göz ardı edilir. Sürücü, DNS tarafından çözümlenen IP adreslerini paralel olarak dener ve kimlik doğrulamayı ilk yanıt verenle tamamlar. |
| Doğru | Yanlış | Sürücü, DNS tarafından çözümlenen IP adresleri genelinde birden çok bağlantı turu gerçekleştirir; ilk denemede en az 500 milisaniye uygulanır ve deneme başına zaman aşımı süreleri kademeli olarak artar; bu işlem, bir bağlantı başarılı olana veya genel Connect Timeout süresine ulaşılana kadar devam eder. |
| Yanlış | Doğru | Sürücü, DNS tarafından çözümlenen IP adreslerini paralel olarak dener ve kimlik doğrulamayı ilk yanıt verenle tamamlar. |
| Yanlış | Yanlış | Sürücü, her DNS çözümlü IP adresini ardışık olarak dener, ta ki biri başarılı olana veya Connect Timeout ulaşana kadar. |
TransparentNetworkIPResolutionvarsayılan olarak .NET Framework'te etkinleştirilmiş ve MultiSubnetFailover varsayılan olarak devre dışı bırakılmıştır. .NET 5 ve sonraki sürümlerde, TransparentNetworkIPResolution tanınan bir bağlantı dizesi anahtar sözcüğü değildir ve ona herhangi bir değer atamak ArgumentException (KeywordNotSupported) oluşturur. Bu sürümler yalnızca MultiSubnetFailover değerini dikkate alır. Bu bölümün geri kalanı (otomatik geçersiz kılma, aşağıdaki uyarıda yer alan hata modları ve AppContext anahtarı) .NET Framework için geçerlidir.
Tavsiye
MultiSubnetFailover=True öğesini, .NET sürümünden veya hedefin Azure SQL ya da şirket içi SQL Server olmasından bağımsız olarak her bağlantı dizesinde ayarlayın.
MultiSubnetFailover=True ilk hızlı yanıt veren replikayı bulan paralel bağlantı kod yolunu seçer. .NET Framework'te ise, uzun bağlantı gecikmelerinin ve kimlik doğrulama öncesi el sıkışma zaman aşımlarının yaygın nedenlerinden biri olan TNIR'in IP başına ardışık yeniden deneme döngüsünü de atlar.
.NET Framework'te, TransparentNetworkIPResolution bağlantı dizesi'te belirtilmediğinde, veri kaynağı tanınan bir Azure SQL uç noktası olduğunda, anahtar Authentication herhangi bir Microsoft Entra ID yöntemine ayarlandığında (Active Directory Password, Active Directory Integrated, Active Directory InteractiveActive Directory Service PrincipalActive Directory Device Code FlowActive Directory Managed IdentityActive Directory MSIActive Directory Defaultveya Active Directory Workload Identity), SqlConnection.AccessToken ya da özellik ayarlandığında sürücü TNIR'i otomatik olarak devre dışı bırakır. Sürücünün tanıdığı uç nokta sonekleri için, SqlConnection.ConnectionString içindeki TransparentNetworkIPResolution girdisine bakın.
Açık TransparentNetworkIPResolution bir değer bu otomatik davranışı atlar: True TNIR'i etkinleştirir ve False TNIR'i koşulsuz olarak devre dışı bırakır. Otomatik davranışı geri getirmek için, anahtar kelimeyi bağlantı dizesi'ten çıkarın. Otomatik geçersiz kılma, bağlantı dizesi Azure SQL'e özel bir CNAME veya vanity DNS adı aracılığıyla işaret ettiğinde ve bu adın Azure SQL uç noktası olarak tanınmadığı durumlarda da geçerli değildir. Otomatik geçersiz kılma özellikle Azure SQL’i hedefler; şirket içi SQL Server için devreye girmez, bu nedenle TNIR burada varsayılan olarak açıktır.
.NET Framework'te uzun bağlantı gecikmeleri
.NET Framework'te, TransparentNetworkIPResolution=True (varsayılan olarak), hedef DNS adı birden fazla IP'ye çözüm bulduğunda ve önceki IP'lerden biri sağlıksız, eski veya erişilemeyen durumlarda uzun bağlantı gecikmelerine ve kimlik doğrulama öncesi el sıkışma zaman aşımına neden olabilir. TNIR, çözülen IP'leri ardışık olarak dener ve her turda deneme başına zaman aşımını artırır, ta ki genel Connect Timeout puana ulaşana kadar. Genellikle beklenmedik uzun bir bağlantı gecikmesi gözlemlersiniz ve bu hatayla sonuçlanır:
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.
Bu desen birkaç topolojide görülür:
- Azure SQL Veritabanı, Azure SQL Yönetilen Örneği veya Microsoft Fabric'te SQL veritabanı. Azure SQL gateway, her kimlik doğrulamayı bir arka uç replikasına yönlendirir. Yönlendirilmiş bir bağlantı başarısız olduğunda, TNIR yeniden yönlendirilmek üzere ağ geçidine geri dönmeden yönlendirilmiş arka ucu yeniden dener; bu da arka uç yük devretmesi sırasındaki gecikmeyi uzatır.
- DNS adı birden çok replika IP adresine çözümlenen bir Always On kullanılabilirlik grubu dinleyicisinin arkasındaki şirket içi SQL Server. Eski bir DNS girişi veya sağlıksız bir replika IP, TNIR çalışan bir kopyaya ulaşmadan önce sıralı olarak denenir.
-
Çok alt ağlı bir küme dinleyicisine sahip yük devretme kümesi örnekleri veya hedef DNS adının birden fazla
A/AAAAkaydına sahip olduğu diğer yapılandırmalar (DNS round-robin gibi).
Bu davranışı önlemek için, bağlantı dizesi'de şu ayarlar MultiSubnetFailover=True yapıldı:
MultiSubnetFailover=True
Bu öneri her .NET sürümünde geçerlidir ve hem Azure SQL'i hem de yeraltı SQL Server'ı kapsar.
MultiSubnetFailover=True olduğunda, sürücü TransparentNetworkIPResolution öğesini göz ardı eder, DNS tarafından çözümlenen IP adreslerini paralel olarak dener ve kimlik doğrulamayı ilk yanıt veren replika ile tamamlar. Adına rağmen, MultiSubnetFailover, DNS adı birden fazla hedef IP'ye çözümlenen tüm dinleyiciler için geçerlidir; bu IP'lerin farklı alt ağlarda olup olmamasına bakılmaksızın, DNS adı tek bir IP'ye çözümlenen bağımsız sunucularda da güvenle kullanılabilir.
Her bağlantı dizesini düzenlemeden işlem genelinde denetim sağlamak için Enable MultiSubnetFailover by default AppContext anahtarını kullanın.
AppContext anahtarıyla TNIR'i devre dışı bırakın
.NET Framework'te, TransparentNetworkIPResolution öğesinin varsayılan değerini true'den false'ye çevirmek için, uygulama başlangıcında Switch.Microsoft.Data.SqlClient.DisableTNIRByDefaultInConnectionString AppContext anahtarını true olarak ayarlayın. Bu anahtar, varsayılan değeri TransparentNetworkIPResolution yalnızca bağlantı dizesi'te olmadığında değiştirir; açık bir değeri geçersiz kılmaz.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.DisableTNIRByDefaultInConnectionString", true);
Bu özellikleri ayarlama hakkında daha fazla bilgi için SqlConnection.ConnectionString Özelliği belgelerine bakın.
Oturum açma sırasında en düşük zaman aşımını etkinleştirme
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
Bir oturum açma girişiminin süresiz olarak beklemesini önlemek için, uygulama başlangıcında AppContext anahtarını Switch.Microsoft.Data.SqlClient.UseOneSecFloorInTimeoutCalculationDuringLogin olarak true ayarlayabilirsiniz:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseOneSecFloorInTimeoutCalculationDuringLogin", false);
ReadAsync'in engelleme davranışını devre dışı bırakma
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
3.0 sürümünden itibaren ReadAsync asenkron çalışır. Önceki sürümler, .NET Framework üzerinde ReadAsync öğesini eşzamanlı olarak çalıştırır ve çağıran iş parçacığını engeller. Bu engelleme davranışını denetlemek için, uygulama başlangıcında AppContext anahtarını Switch.Microsoft.Data.SqlClient.MakeReadAsyncBlocking için true veya false olarak ayarlayın:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.MakeReadAsyncBlocking", false);
rowversion NULL davranışını etkinleştir
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
3.0 sürümünden itibaren, bir rowversion değeri null olduğunda, SqlDataReader, boş bir DBNull yerine byte[] değeri döndürür. Boş bir byte[] döndürmeye yönelik eski davranışı etkinleştirmek için, uygulama başlangıcında Switch.Microsoft.Data.SqlClient.LegacyRowVersionNullBehavior AppContext anahtarını etkinleştirin.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.LegacyRowVersionNullBehavior", true);
Güvenli olmayan TLS uyarılarını gizleme
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
(Sürüm 4.0.1'den itibaren kullanılabilir)
bağlantı dizesi'te kullanılırkenEncrypt=false, konsol TLS sürümü 1.2 veya daha düşük ise bir güvenlik uyarısı verir. Bu uyarıyı uygulama başlatıldığında aşağıdaki AppContext anahtarını etkinleştirerek kapatın:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.SuppressInsecureTLSWarning", true);
Sunucu Tarafından Sağlanan Yük Devretme İş Ortağını Yoksay
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
(5.1.8, 6.0.4 ve 6.1.3 sürümlerinden itibaren kullanılabilir)
Yük devretme işleminden sonra, sunucu tarafından sağlanan yük devretme iş ortağı bilgileri, bağlantı dizesinde sağlanan yük devretme iş ortağı bilgileri yerine tercih edilir. Sunucu tarafından sağlanan yük devretme iş ortağı bilgilerini yoksaymak ve yalnızca bağlantı dizesinde sağlanan yük devretme iş ortağı bilgilerini göz önünde bulundurmak için, uygulama başlangıcında bu AppContext anahtarını etkinleştirin:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.IgnoreServerProvidedFailoverPartner", true);
Bağlantı boşta kalma zaman aşımını uygula
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
7.1.0-preview2 sürümünden itibaren, Connection Idle Timeout bağlantı dizesi anahtar kelimesi boşta çalışma süresini saniyeler cinsinden yapılandırır; bundan sonra havuza alınan bağlantı tahliye için uygun hale gelir (varsayılan 300; 0 değeri boşta süresini devre dışı bırakır). Uygun bir bağlantı, daha sonraki bir alma veya bakım döngüsünde çıkarılır; bu nedenle bunun tam olarak ne zaman gerçekleşeceği, havuzun uygulanışına ve bakım sıklığına göre değişebilir. Anahtar sözcük yalnızca eski boşta kalma zaman aşımı davranışı devre dışı bırakıldığında zorunlu kılınır. Anahtarın değeri varsayılan olarak true olduğunda, havuz geçmişteki davranışı korur ve anahtar sözcüğün hiçbir etkisi olmaz.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseLegacyIdleTimeoutBehavior", false);
V2 bağlantı havuzunu etkinleştir
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
6.1 sürümünden itibaren SqlClient alternatif, deneysel bir bağlantı havuzu uygulaması (V2) içerir. V1 havuzu varsayılan olarak kalır (geçiş varsayılan olarak false olur). V2 havuzuna katılmak için, uygulama başladığında AppContext anahtarını Switch.Microsoft.Data.SqlClient.UseConnectionPoolV2 etkinleştirin.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseConnectionPoolV2", true);
Havuzda bekleme sürelerini bağlantı zaman aşımına dahil et.
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
7.1.0-preview2 sürümünden itibaren, havuzdan bağlantı beklemek için harcanan süre çağıranın Connect Timeout bütçesinden sayılabilir; bu nedenle havuzda bekleme süresi ile ağ bağlantısı denemesi tek bir genel zaman aşımı süresini paylaşır. Anahtar varsayılan değeri olan false olarak ayarlandığında, havuz işlemleri tam Connect Timeout alır ve ağ bağlantısı girişimi ayrıca tam bir bütçe alır.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseOverallConnectTimeoutForPoolWait", true);
Oturum açma hatalarında eski yük devretme alternasyonuna geri dön
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
7.1.0-preview2 sürümünden itibaren, yük devretme yapılandırıldığında SqlClient, oturum açma aşamasında döndürülen SQL hatalarında artık yük devretme ortağına geçiş yapmaz. Eski alternatif davranışına dönmek için, uygulama başlangıcında AppContext anahtarını Switch.Microsoft.Data.SqlClient.UseLegacyFailoverAlternationOnLoginSqlErrors etkinleştirin. Anahtar varsayılan olarak false şeklindedir.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseLegacyFailoverAlternationOnLoginSqlErrors", true);
Vartime parametrelerinde açık bir sıfır ölçeğine saygı gösterin
Şunlar için geçerlidir: .NET Framework; .NET; .NET Standard
Varsayılan olarak, SqlClient ölçeği datetime2, datetimeoffset veya zaman parametreleri için açıkça 0'a ayarladığınızda 7 ölçek gönderir. 6.0 veya sonraki bir sürümde, uygulama başlangıcında 0’ın açıkça belirtilen ölçeğini korumak için Switch.Microsoft.Data.SqlClient.LegacyVarTimeZeroScaleBehaviour değerini false olarak ayarlayın. Anahtarın varsayılan değeri true'dir.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.LegacyVarTimeZeroScaleBehaviour", false);