Microsoft.Extensions.Http.Resilience kullanan .NET uygulamalarında yeniden denemeleri ve zaman aşımlarını test edin.

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-After sü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, RetryAfterPlugin bunu 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 POST gibi istekler yalnızca bir kez gönderilir. Bunları hariç tutmak için options.Retry.DisableFor(...) veya options.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.