diff --git a/src/Libraries/Microsoft.Extensions.Http.Resilience/Resilience/ResilienceHttpClientBuilderExtensions.Resilience.cs b/src/Libraries/Microsoft.Extensions.Http.Resilience/Resilience/ResilienceHttpClientBuilderExtensions.Resilience.cs
index 1829aefa101..48a565db41b 100644
--- a/src/Libraries/Microsoft.Extensions.Http.Resilience/Resilience/ResilienceHttpClientBuilderExtensions.Resilience.cs
+++ b/src/Libraries/Microsoft.Extensions.Http.Resilience/Resilience/ResilienceHttpClientBuilderExtensions.Resilience.cs
@@ -2,11 +2,13 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using System.Diagnostics.CodeAnalysis;
using System.Net.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.ExceptionSummarization;
using Microsoft.Extensions.Http.Resilience;
using Microsoft.Extensions.Http.Resilience.Internal;
+using Microsoft.Shared.DiagnosticIds;
using Microsoft.Shared.Diagnostics;
using Polly;
using Polly.Registry;
@@ -75,6 +77,28 @@ public static IHttpResiliencePipelineBuilder AddResilienceHandler(
return pipelineBuilder;
}
+ ///
+ /// Removes all resilience handlers registered earlier.
+ ///
+ /// The builder instance.
+ /// The value of .
+ [Experimental(diagnosticId: DiagnosticIds.Experiments.Resilience, UrlFormat = DiagnosticIds.UrlFormat)]
+ public static IHttpClientBuilder RemoveAllResilienceHandlers(this IHttpClientBuilder builder)
+ {
+ _ = Throw.IfNull(builder);
+ _ = builder.ConfigureAdditionalHttpMessageHandlers(static (handlers, _) =>
+ {
+ for (int i = handlers.Count - 1; i >= 0; i--)
+ {
+ if (handlers[i] is ResilienceHandler)
+ {
+ handlers.RemoveAt(i);
+ }
+ }
+ });
+ return builder;
+ }
+
private static Func> CreatePipelineSelector(IServiceProvider serviceProvider, string pipelineName)
{
var resilienceProvider = serviceProvider.GetRequiredService>();
diff --git a/test/Libraries/Microsoft.Extensions.Http.Resilience.Tests/Resilience/HttpClientBuilderExtensionsTests.Resilience.cs b/test/Libraries/Microsoft.Extensions.Http.Resilience.Tests/Resilience/HttpClientBuilderExtensionsTests.Resilience.cs
index 5ceb74f2217..54e0ab3f3e3 100644
--- a/test/Libraries/Microsoft.Extensions.Http.Resilience.Tests/Resilience/HttpClientBuilderExtensionsTests.Resilience.cs
+++ b/test/Libraries/Microsoft.Extensions.Http.Resilience.Tests/Resilience/HttpClientBuilderExtensionsTests.Resilience.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
@@ -286,6 +287,77 @@ public void AddResilienceHandler_AuthorityByCustomSelector_NotValidated()
Assert.NotNull(factory.CreateClient("my-client"));
}
+ [Fact]
+ public void RemoveAllResilienceHandlers_ArgumentValidation()
+ {
+ var services = new ServiceCollection();
+ IHttpClientBuilder? builder = null;
+ Assert.Throws(() => builder!.RemoveAllResilienceHandlers());
+ }
+
+ [Fact]
+ public void RemoveAllResilienceHandlers_EnsureHandlersRemoved()
+ {
+ var services = new ServiceCollection();
+
+ IHttpClientBuilder? builder = services.AddHttpClient("custom");
+
+ builder.AddStandardResilienceHandler();
+
+ builder.ConfigureAdditionalHttpMessageHandlers((handlers, _) =>
+ {
+ Assert.Single(handlers);
+ });
+
+ builder.RemoveAllResilienceHandlers();
+
+ builder.ConfigureAdditionalHttpMessageHandlers((handlers, _) =>
+ {
+ Assert.Empty(handlers);
+ });
+
+ using ServiceProvider serviceProvider = services.BuildServiceProvider();
+ serviceProvider.GetRequiredService().CreateClient("custom");
+ }
+
+ [Fact]
+ public void RemoveAllResilienceHandlers_AddHandlersAfterRemoval()
+ {
+ var services = new ServiceCollection();
+
+ IHttpClientBuilder? builder = services.AddHttpClient("custom");
+ builder.RemoveAllResilienceHandlers().AddStandardResilienceHandler();
+ builder.ConfigureAdditionalHttpMessageHandlers((handlers, _) =>
+ {
+ Assert.Single(handlers);
+ });
+
+ using ServiceProvider serviceProvider = services.BuildServiceProvider();
+ serviceProvider.GetRequiredService().CreateClient("custom");
+ }
+
+ [Fact]
+ public void RemoveAllResilienceHandlers_EnsureOnlyResilienceHandlersRemoved()
+ {
+ var services = new ServiceCollection();
+
+ IHttpClientBuilder? builder = services.AddHttpClient("custom");
+
+ builder.AddHttpMessageHandler(() => new TestHandlerStub(HttpStatusCode.OK));
+ builder.AddStandardResilienceHandler();
+
+ builder.RemoveAllResilienceHandlers();
+
+ builder.ConfigureAdditionalHttpMessageHandlers((handlers, _) =>
+ {
+ Assert.Single(handlers);
+ Assert.Equal(typeof(TestHandlerStub), handlers.First().GetType());
+ });
+
+ using ServiceProvider serviceProvider = services.BuildServiceProvider();
+ serviceProvider.GetRequiredService().CreateClient("custom");
+ }
+
private void ConfigureBuilder(ResiliencePipelineBuilder builder) => builder.AddTimeout(TimeSpan.FromSeconds(1));
private class TestMetricsEnricher : MeteringEnricher