diff --git a/src/Web/WebMVC/Services/Utilities/HttpApiClientWrapper.cs b/src/Web/WebMVC/Services/Utilities/HttpApiClientWrapper.cs
index 5dd26a0fb..1e55305c5 100644
--- a/src/Web/WebMVC/Services/Utilities/HttpApiClientWrapper.cs
+++ b/src/Web/WebMVC/Services/Utilities/HttpApiClientWrapper.cs
@@ -8,6 +8,12 @@ using System.Threading.Tasks;
namespace WebMVC.Services.Utilities
{
+ ///
+ /// HttpClient wrapper that integrates Retry and Circuit
+ /// breaker policies when calling to Api services.
+ /// Currently is ONLY implemented for the ASP MVC
+ /// and Xamarin App
+ ///
public class HttpApiClientWrapper : IHttpClient
{
private HttpClient _client;
@@ -49,11 +55,11 @@ namespace WebMVC.Services.Utilities
Policy.Handle()
.WaitAndRetryAsync(
// number of retries
- 3,
+ 3,
// exponential backofff
retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
// on retry
- (exception, timeSpan, retryCount, context) =>
+ (exception, timeSpan, retryCount, context) =>
{
_logger.LogTrace($"Retry {retryCount} " +
$"of {context.PolicyKey} " +
@@ -62,27 +68,21 @@ namespace WebMVC.Services.Utilities
}
);
- // Notice that these (and other methods below) are Task
- // returning asynchronous methods. But, they do not
- // have the 'async' modifier, and do not contain
- // any 'await statements. In each of these methods,
- // the only asynchronous call is the last (or only)
- // statement of the method. In those instances,
- // a Task returning method that does not use the
- // async modifier is preferred. The compiler generates
- // synchronous code for this method, but returns the
- // task from the underlying asynchronous method. The
- // generated code does not contain the state machine
- // generated for asynchronous methods.
public Task GetStringAsync(string uri) =>
- HttpInvoker(() => _client.GetStringAsync(uri));
+ HttpInvoker(() =>
+ _client.GetStringAsync(uri));
public Task PostAsync(string uri, T item) =>
// a new StringContent must be created for each retry
// as it is disposed after each call
- HttpInvoker(() =>_client.PostAsync(uri,
- new StringContent(JsonConvert.SerializeObject(item),
- System.Text.Encoding.UTF8, "application/json")));
+ HttpInvoker(() =>
+ {
+ var response = _client.PostAsync(uri, new StringContent(JsonConvert.SerializeObject(item), System.Text.Encoding.UTF8, "application/json"));
+ // raise exception if not success response
+ // needed for circuit breaker to track fails
+ response.Result.EnsureSuccessStatusCode();
+ return response;
+ });
public Task DeleteAsync(string uri) =>
HttpInvoker(() => _client.DeleteAsync(uri));
diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs
index 7888ae253..ee2412bee 100644
--- a/src/Web/WebMVC/Startup.cs
+++ b/src/Web/WebMVC/Startup.cs
@@ -54,11 +54,11 @@ namespace Microsoft.eShopOnContainers.WebMVC
if(Configuration.GetValue("ActivateCircuitBreaker") == bool.TrueString)
{
- services.AddSingleton();
+ services.AddTransient();
}
else
{
- services.AddSingleton();
+ services.AddTransient();
}
}
diff --git a/src/Web/WebSPA/Client/modules/shared/services/data.service.ts b/src/Web/WebSPA/Client/modules/shared/services/data.service.ts
index 785728943..3b121f4e7 100644
--- a/src/Web/WebSPA/Client/modules/shared/services/data.service.ts
+++ b/src/Web/WebSPA/Client/modules/shared/services/data.service.ts
@@ -11,6 +11,8 @@ import 'rxjs/add/operator/catch';
import { SecurityService } from './security.service';
import { Guid } from '../../../guid';
+// Implementing a Retry-Circuit breaker policy
+// is pending to do for the SPA app
@Injectable()
export class DataService {
constructor(private http: Http, private securityService: SecurityService) { }