public static AsyncPolicyWrap CreateExecutionPolicyWrapper() { // Following example causes the policy to return a bad request HttpResponseMessage with a probability of 5% if enabled var fault = new CosmosException("Simulated cosmos exception", HttpStatusCode.ServiceUnavailable, -1, "", 0); AsyncInjectOutcomePolicy injectOutcomePolicy = CreateChaosFaultPolicy <CosmosException>(fault); AsyncTimeoutPolicy timeoutPolicy = CreateTimeOutPolicy(5, TimeoutStrategy.Pessimistic); return(Policy.WrapAsync(timeoutPolicy, injectOutcomePolicy)); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllers(); #region Behavior AsyncInjectBehaviourPolicy behaviorPolicy = MonkeyPolicy.InjectBehaviourAsync( async() => { await Task.Delay(100); Debug.WriteLine("Do what you want here"); }, 1, // 25% of the time async() => await Task.FromResult(true)); services.AddSingleton(behaviorPolicy); #endregion #region Latency var latencyPolicy = MonkeyPolicy.InjectLatencyAsync <HttpResponseMessage>( TimeSpan.FromSeconds(5), // delay di 5 secondi 0.5, // 50% delle richieste () => true); // abilitata IAsyncPolicy <HttpResponseMessage> timeoutPolicy = Policy.TimeoutAsync <HttpResponseMessage>(2); #endregion #region Fault var faultHttpResponseMessage = new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent("Simmy Internal Server Error") }; AsyncInjectOutcomePolicy <HttpResponseMessage> faultPolicy = MonkeyPolicy.InjectFaultAsync( faultHttpResponseMessage, injectionRate: .5, enabled: () => true ); #endregion #region Retry IAsyncPolicy <HttpResponseMessage> retryPolicy = Policy .HandleResult <HttpResponseMessage>(r => !r.IsSuccessStatusCode) .Or <Exception>() .RetryAsync(2, onRetry: (response, retryCount) => { if (response.Result?.StatusCode != HttpStatusCode.InternalServerError) { //Do somethig } else { //Log something } }); #endregion AsyncPolicyWrap <HttpResponseMessage> faultAndRetry = Policy.WrapAsync(retryPolicy, faultPolicy); IAsyncPolicy <HttpResponseMessage> latencyTimeoutAndRetry = Policy.WrapAsync( retryPolicy, timeoutPolicy, latencyPolicy); services.AddRefitClient <IAzureDevOpsApi>() .ConfigureHttpClient((serviceProvider, client) => { client.BaseAddress = new Uri(Configuration["AppSettings:AzureDevOpsApiAddress"]); client.DefaultRequestHeaders.Add("Accept", "application/json"); }) .AddPolicyHandler(faultAndRetry); //.AddPolicyHandler(latencyTimeoutAndRetry); }