Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Tip
Nybörjare på strypning? Lär dig vad strypning innebär och hur du hanterar det.
Överblick
Mål: Bekräfta att din .NET HTTP-resilienshanterare försöker igen, backar och får timeout som förväntat
Tid: 15 minuter
Pluginer:GenericRandomErrorPlugin, RetryAfterPlugin, LatencyPlugin
Krav:Konfigurera Dev Proxy, en .NET-app som använder Microsoft.Extensions.Http.Resilience
Du har lagt till AddStandardResilienceHandler() i din HttpClient. Hur vet du att det fungerar? De API:er som du anropar misslyckas sällan på begäran och enhetstester som mockar HttpMessageHandler hoppar över den resilienspipeline som du vill testa.
Dev Proxy agerar mellan din app och API:et. Den returnerar fel och långsamma svar till din app, så appen körs oförändrad och resilience handler reagerar på verkliga HTTP-svar. Du ser alla försök i Dev Proxy-utdata.
Vad standardhanteraren för resiliens gör
Innan du testar ska du veta vad du kan förvänta dig. Med standardalternativ: AddStandardResilienceHandler()
| Behavior | Standardvärde |
|---|---|
| Försök igen på | HTTP 500 och högre, 408, 429, HttpRequestException och TimeoutRejectedException |
| Antal återförsök | 3, med exponentiell backoff och jitter, med början på 2 sekunder |
Retry-After rubrik |
Hedrad. Hanteraren väntar på den tid som API:et begär. |
| Försöksavbrott | 10 sekunder per försök |
| Total tidsgräns | 30 sekunder för begäran, inklusive alla återförsök |
En fullständig lista över strategier och deras standardvärden finns i Standard resilience handler defaults.
Dirigera din app via Dev Proxy
.NET använder systemproxyn, så när du startar Dev Proxy fångar den upp appens begäranden utan kodändringar. Mer information finns i artikeln Använd Dev Proxy med .NET-appar.
Simulera tillfälliga fel
Skapa en Dev Proxy-konfiguration som gör att begäranden till ditt API misslyckas med de fel som hanteraren gör om. I det här exemplet används https://api.contoso.com. Ersätt den med URL:en för API:et som appen anropar.
Fil: 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
}
}
Försiktighet
Lägg till RetryAfterPlugin före GenericRandomErrorPlugin i din konfigurationsfil. Om du lägger till den efter gör GenericRandomErrorPlugin att begäran misslyckas innan RetryAfterPlugin kan kontrollera den.
I felfilen definierar du ett begränsningssvar och två serverfel. Värdet @dynamic anger Retry-After header och instruerar RetryAfterPlugin att kontrollera att appen väntar så länge innan den anropar API:et igen.
Fil: 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
}
]
}
]
}
Starta Dev Proxy och kör din app.
devproxy --config-file devproxyrc.json
Med en felfrekvens på 50 % lyckas de flesta förfrågningar efter en eller två återförsök. Kontrollera följande i Dev Proxy-utdata:
- Efter ett 429-svar kommer nästa försök till samma URL efter den tid som anges av
Retry-After. Dev Proxy använder som standard 5 sekunder. Om din app anropar API:et för tidigt rapporterarRetryAfterPlugindet och begränsar begäran. - Appen skickar inte fler försök än du har konfigurerat.
- Begäranden som du inte vill försöka igen, till exempel en
POSTsom skapar en post, skickas bara en gång. Om du vill exkludera dem, anropaoptions.Retry.DisableForUnsafeHttpMethods()elleroptions.Retry.DisableFor(...).
Testa vad som händer när återförsöken tar slut
Återförsök döljer tillfälliga fel. Du behöver också veta vad din app gör när API:et fortsätter att misslyckas. Starta Dev Proxy med en felfrekvens på 100%:
devproxy --config-file devproxyrc.json --failure-rate 100
Dev Proxy visar 4 försök för varje begäran: den ursprungliga begäran och 3 återförsök. Efter det senaste återförsöket kastar standardhanteraren inte något undantag. Det returnerar det senaste felsvaret till din kod. Kontrollera vad din app gör med den. Till exempel kastar EnsureSuccessStatusCode() en HttpRequestException, och GetStringAsync() kastar också en HttpRequestException. Kontrollera att appen visar ett användbart meddelande eller faller tillbaka, i stället för att krascha eller visa ett allmänt fel.
Testtidsgränser
Långsamma API:er utlöser en annan kodväg i hanteraren. Om du vill testa det använder du LatencyPlugin för att fördröja svar så att tidsgränsen på 10 sekunder för försöket överskrids.
Fil: 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
}
}
Starta Dev Proxy och kör din app. Varje försök tar längre tid än 10 sekunder, så tidsgränsen för försöket avbryter det och hanteraren försöker igen. Efter 30 sekunder avbryter den totala tidsgränsen begäran och din kod får en TimeoutRejectedException. Kontrollera att appen fångar felet och meddelar användaren vad som hände.
Tip
Om du vill testa samma scenarier med dina egna resiliensinställningar ändrar du värdena i AddStandardResilienceHandler(options => ...)-anropet och kör samma Dev Proxy-konfigurationer igen.
Nästa steg
Läs mer om hur du simulerar strypning för alla API:er.
Se även
- Använd Dev Proxy med .NET-program – .NET konfiguration
- GenericRandomErrorPlugin – fullständig referens
- RetryAfterPlugin – Verifiera återförsöksbeteende
- LatencyPlugin – Simulera långsamma svar
- Felfrekvens för ändringsbegäran – Justera hur ofta begäranden misslyckas
- Använda Dev Proxy i CI/CD – Automatisera återhämtningstestning i din pipeline