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.
Tip
Kısıtlamaya yeni misiniz? Kısıtlamanın ne olduğunu ve bununla nasıl başa çıkacağınızı öğrenin.
Bir bakışta
Hedef: .NET HTTP dayanıklılık işleyicinizin beklendiği gibi yeniden deneme yaptığını, geri çekildiğini ve zaman aşımına uğradığını doğrulayın
Süre: 15 dakika
Eklentiler:GenericRandomErrorPlugin, RetryAfterPlugin, LatencyPlugin
Önkoşullar:Dev Proxy’yi ayarlayın, Microsoft.Extensions.Http.Resilience kullanan bir .NET uygulaması
AddStandardResilienceHandler() öğesini HttpClient öğenize eklediniz. İşe yaradığını nereden biliyorsun? Çağırdığınız API'ler istendiğinde nadiren başarısız olur ve HttpMessageHandler taklit eden birim testleri test etmek istediğiniz dayanıklılık işlem hattını atlar.
Geliştirme Proxy'si uygulamanızla API arasında yer alır. Uygulamanıza hatalar ve yavaş yanıtlar döndürür, böylece uygulamanız değişmeden çalışır ve dayanıklılık işleyicisi gerçek HTTP yanıtlarına tepki verir. Geliştirme Proxy'si çıkışında her denemeyi görürsünüz.
standart dayanıklılık işleyici ne yapar?
Test etmeden önce ne bekleyebileceğinizi bilin. Varsayılan seçeneklerle: AddStandardResilienceHandler()
| Behavior | Varsayılan |
|---|---|
| Yeniden denemeler açık | HTTP 500 ve üzeri, 408, 429, HttpRequestExceptionve TimeoutRejectedException |
| Yeniden deneme sayısı | 3, üstel geri çekilme ve jitter ile, 2 saniyeden başlayarak |
Retry-After Üstbilgi |
Onurlandırıldım. İşleyici, API'nin istediği süre boyunca bekler. |
| Deneme zaman aşımı | Deneme başına 10 saniye |
| Toplam zaman aşımı | tüm yeniden denemeler de dahil olmak üzere istek için 30 saniye |
Stratejilerin ve bunların varsayılanlarının tam listesi için bkz. Standart dayanıklılık işleyicisi varsayılanları.
Uygulamanızı Dev Proxy aracılığıyla yönlendirin
.NET sistem proxy'sini kullandığından, Geliştirme Proxy'sini başlattığınızda uygulamanızın isteklerini kod değişikliği olmadan yakalar. Daha fazla bilgi için bkz. .NET uygulamalarla Dev Proxy kullanma.
Geçici hataları simüle edin
İşleyicinin yeniden denediği hatalarla API'nize yönelik istekleri başarısız kılan bir Dev Proxy yapılandırması oluşturun. Bu örnekte https://api.contoso.com kullanılmıştır. Bunu uygulamanızın çağırdığı API'nin URL'si ile değiştirin.
Dosya: devproxyrc.json
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/rc.schema.json",
"plugins": [
{
"name": "RetryAfterPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll"
},
{
"name": "GenericRandomErrorPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
"configSection": "transientErrors"
}
],
"urlsToWatch": [
"https://api.contoso.com/*"
],
"transientErrors": {
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.schema.json",
"errorsFile": "transient-errors.json",
"rate": 50
}
}
Caution
Yapılandırma dosyanıza RetryAfterPlugin'ı GenericRandomErrorPlugin'in önüne ekleyin. Daha sonra eklerseniz, GenericRandomErrorPlugin, RetryAfterPlugin denetleyemeden önce isteği başarısız kılar.
Hatalar dosyasında bir hız sınırlama yanıtı ve iki sunucu hatası tanımlayın.
@dynamic değeri Retry-After üst bilgisini ayarlar ve RetryAfterPlugin uygulamanızın API'yi yeniden çağırmadan önce bu kadar uzun süre bekleyip beklemediğini denetlemesini söyler.
Dosya: transient-errors.json
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.errorsfile.schema.json",
"errors": [
{
"request": {
"url": "https://api.contoso.com/*"
},
"responses": [
{
"statusCode": 429,
"headers": [
{
"name": "Retry-After",
"value": "@dynamic"
}
]
},
{
"statusCode": 500
},
{
"statusCode": 503
}
]
}
]
}
Geliştirme Proxy'sini başlatın ve uygulamanızı çalıştırın.
devproxy --config-file devproxyrc.json
50% hata oranıyla çoğu istek bir veya iki yeniden denemeden sonra kurtarılır. Dev Proxy çıktısında şunları denetleyin:
- 429 yanıtını aldıktan sonra aynı URL'ye bir sonraki deneme
Retry-Aftersüresinden sonra yapılır. Dev Proxy varsayılan olarak 5 saniye kullanacak şekilde ayarlanmıştır. Uygulamanız API'yi çok erken çağırırsa,RetryAfterPluginbunu bildirir ve isteği kısıtlar. - Uygulamanız yapılandırdığınızdan daha fazla deneme göndermez.
- Yeniden denemek istemediğiniz, kayıt oluşturan
POSTgibi istekler yalnızca bir kez gönderilir. Bunları hariç tutmak içinoptions.Retry.DisableFor(...)veyaoptions.Retry.DisableForUnsafeHttpMethods()numarasını arayın.
Yeniden denemeler bittiğinde ne olacağını test edin
Yeniden denemeler kısa süreli hataları gizler. API başarısız olduğunda uygulamanızın ne yaptığını da bilmeniz gerekir. Dev Proxy'yi 100% hata oranıyla başlatın:
devproxy --config-file devproxyrc.json --failure-rate 100
Geliştirme Proxy'si her istek için 4 deneme gösterir: özgün istek ve 3 yeniden deneme. Son yeniden denemeden sonra standart işleyici fırlatmaz. Kodunuz için son hata yanıtını döndürür. Uygulamanızın bununla ne yaptığını kontrol edin. Örneğin, EnsureSuccessStatusCode() bir HttpRequestException fırlatır ve GetStringAsync() de fırlatır. Uygulamanızın kilitlenmek veya genel bir hata göstermek yerine yararlı bir ileti gösterdiğinden ya da yedek bir davranış sergilediğinden emin olun.
Test zaman aşımı
Yavaş API'ler işleyicide farklı bir yol tetikler. Test etmek için LatencyPlugin kullanarak yanıtları 10 saniyelik deneme zaman aşımının ötesinde geciktirin.
Dosya: devproxyrc.json
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/rc.schema.json",
"plugins": [
{
"name": "LatencyPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
"configSection": "slowApi"
}
],
"urlsToWatch": [
"https://api.contoso.com/*"
],
"slowApi": {
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/latencyplugin.schema.json",
"minMs": 11000,
"maxMs": 15000
}
}
Geliştirme Proxy'sini başlatın ve uygulamanızı çalıştırın. Her deneme 10 saniyeden uzun sürer, bu nedenle deneme zaman aşımı bunu iptal eder ve işleyici yeniden dener. 30 saniye sonra toplam zaman aşımı isteği iptal eder ve kodunuz bir TimeoutRejectedException alır. Uygulamanızın bunu yakalayıp yakalamadığını denetleyin ve kullanıcıya ne olduğunu anlatın.
Tip
Aynı senaryoları kendi dayanıklılık ayarlarınızla test etmek için AddStandardResilienceHandler(options => ...) çağrınızdaki değerleri değiştirin ve aynı Dev Proxy yapılandırmalarını yeniden çalıştırın.
Sonraki adım
Herhangi bir API'de kısıtlama simülasyonu yapma hakkında daha fazla bilgi edinin.
Ayrıca bkz.
- Dev Proxy'yi .NET uygulamalarıyla kullanma - .NET kurulumu
- GenericRandomErrorPlugin - Tam referans
- RetryAfterPlugin - Yeniden deneme davranışını doğrulama
- LatencyPlugin - Yavaş yanıt simülasyonu
- Değişiklik isteği başarısızlık oranı - İsteklerin ne sıklıkta başarısız olduğunu ayarlama
- CI/CD'de Geliştirme Proxy'si kullanma - İşlem hattınızda dayanıklılık testini otomatikleştirme