diff --git a/src/ApiGateways/ApiGw-Base/Dockerfile b/src/ApiGateways/ApiGw-Base/Dockerfile
index 7fdd5f073..3126d6e37 100644
--- a/src/ApiGateways/ApiGw-Base/Dockerfile
+++ b/src/ApiGateways/ApiGw-Base/Dockerfile
@@ -1,8 +1,8 @@
-FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
+FROM microsoft/dotnet:2.1.3-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
-FROM microsoft/dotnet:2.1-sdk AS build
+FROM microsoft/dotnet:2.1.401-sdk AS build
WORKDIR /src
COPY src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj src/ApiGateways/ApiGw-Base/
RUN dotnet restore src/ApiGateways/ApiGw-Base/
diff --git a/src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj b/src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj
index d3b1a049b..9ab762c58 100644
--- a/src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj
+++ b/src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj
@@ -1,15 +1,16 @@
-
- netcoreapp2.1
-
+
+ netcoreapp2.1
+ 2.1.3
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
diff --git a/src/ApiGateways/ApiGw-Base/Properties/launchSettings.json b/src/ApiGateways/ApiGw-Base/Properties/launchSettings.json
index 2308ca466..7c7e1f477 100644
--- a/src/ApiGateways/ApiGw-Base/Properties/launchSettings.json
+++ b/src/ApiGateways/ApiGw-Base/Properties/launchSettings.json
@@ -13,7 +13,8 @@
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
- }
+ },
+ "use64Bit": true
},
"OcelotApiGw": {
"commandName": "Project",
diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile
index 7787dd159..b955542f9 100644
--- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile
+++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile
@@ -1,8 +1,8 @@
-FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
+FROM microsoft/dotnet:2.1.3-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
-FROM microsoft/dotnet:2.1-sdk AS build
+FROM microsoft/dotnet:2.1.401-sdk AS build
WORKDIR /src
COPY . .
WORKDIR /src/src/ApiGateways/Mobile.Bff.Shopping/aggregator
diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj
index d49c6a18f..704911946 100644
--- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj
+++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj
@@ -1,20 +1,21 @@
-
- netcoreapp2.1
- Mobile.Shopping.HttpAggregator
- Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator
- ..\..\..\docker-compose.dcproj
-
+
+ netcoreapp2.1
+ 2.1.3
+ Mobile.Shopping.HttpAggregator
+ Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator
+ ..\..\..\docker-compose.dcproj
+
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Properties/launchSettings.json b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Properties/launchSettings.json
index 925e70b0d..adfd79888 100644
--- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Properties/launchSettings.json
+++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Properties/launchSettings.json
@@ -14,7 +14,8 @@
"launchUrl": "api/values",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
- }
+ },
+ "use64Bit": true
},
"PurchaseForMvc": {
"commandName": "Project",
diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs
index 1d24e8312..9b068cd60 100644
--- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs
+++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs
@@ -19,166 +19,176 @@ using System.Net.Http;
namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator
{
- public class Startup
- {
- public Startup(IConfiguration configuration)
- {
- Configuration = configuration;
- }
-
- public IConfiguration Configuration { get; }
-
- // This method gets called by the runtime. Use this method to add services to the container.
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddCustomMvc(Configuration)
- .AddCustomAuthentication(Configuration)
- .AddHttpServices();
- }
-
- // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
- public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
- {
- var pathBase = Configuration["PATH_BASE"];
-
- if (!string.IsNullOrEmpty(pathBase))
- {
- loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'");
- app.UsePathBase(pathBase);
- }
-
- app.UseCors("CorsPolicy");
-
- if (env.IsDevelopment())
- {
- app.UseDeveloperExceptionPage();
- }
-
- app.UseAuthentication();
-
- app.UseMvc();
-
- app.UseSwagger().UseSwaggerUI(c =>
- {
- c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Purchase BFF V1");
- c.ConfigureOAuth2("Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregatorwaggerui", "", "", "Purchase BFF Swagger UI");
- });
- }
- }
-
- public static class ServiceCollectionExtensions
- {
- public static IServiceCollection AddCustomMvc(this IServiceCollection services, IConfiguration configuration)
- {
- services.AddOptions();
- services.Configure(configuration.GetSection("urls"));
-
- services.AddMvc();
-
- services.AddSwaggerGen(options =>
- {
- options.DescribeAllEnumsAsStrings();
- options.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info
- {
- Title = "Shopping Aggregator for Mobile Clients",
- Version = "v1",
- Description = "Shopping Aggregator for Mobile Clients",
- TermsOfService = "Terms Of Service"
- });
-
- options.AddSecurityDefinition("oauth2", new OAuth2Scheme
- {
- Type = "oauth2",
- Flow = "implicit",
- AuthorizationUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/authorize",
- TokenUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/token",
- Scopes = new Dictionary()
- {
- { "mobileshoppingagg", "Shopping Aggregator for Mobile Clients" }
- }
- });
-
- options.OperationFilter();
- });
-
- services.AddCors(options =>
- {
- options.AddPolicy("CorsPolicy",
- builder => builder.AllowAnyOrigin()
- .AllowAnyMethod()
- .AllowAnyHeader()
- .AllowCredentials());
- });
-
- return services;
- }
- public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration)
- {
- JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
- var identityUrl = configuration.GetValue("urls:identity");
- services.AddAuthentication(options =>
- {
- options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
- options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
-
- }).AddJwtBearer(options =>
- {
- options.Authority = identityUrl;
- options.RequireHttpsMetadata = false;
- options.Audience = "mobileshoppingagg";
- options.Events = new JwtBearerEvents()
- {
- OnAuthenticationFailed = async ctx =>
- {
- int i = 0;
- },
- OnTokenValidated = async ctx =>
- {
- int i = 0;
- }
- };
- });
-
- return services;
- }
- public static IServiceCollection AddHttpServices(this IServiceCollection services)
- {
- //register delegating handlers
- services.AddTransient();
- services.AddSingleton();
-
- //register http services
- services.AddHttpClient()
- .AddHttpMessageHandler()
- .AddPolicyHandler(GetRetryPolicy())
- .AddPolicyHandler(GetCircuitBreakerPolicy());
-
- services.AddHttpClient()
- .AddPolicyHandler(GetRetryPolicy())
- .AddPolicyHandler(GetCircuitBreakerPolicy());
-
- services.AddHttpClient()
- .AddPolicyHandler(GetRetryPolicy())
- .AddPolicyHandler(GetCircuitBreakerPolicy());
-
-
-
- return services;
- }
-
- static IAsyncPolicy GetRetryPolicy()
- {
- return HttpPolicyExtensions
- .HandleTransientHttpError()
- .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
- .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
-
- }
- static IAsyncPolicy GetCircuitBreakerPolicy()
- {
- return HttpPolicyExtensions
- .HandleTransientHttpError()
- .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
- }
- }
+ public class Startup
+ {
+ public Startup(IConfiguration configuration)
+ {
+ Configuration = configuration;
+ }
+
+ public IConfiguration Configuration { get; }
+
+ // This method gets called by the runtime. Use this method to add services to the container.
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services
+ .AddCustomMvc(Configuration)
+ .AddCustomAuthentication(Configuration)
+ .AddHttpServices();
+ //services.AddHttpsRedirection(opts =>
+ //{
+ // opts.HttpsPort = 4120;
+ //});
+ }
+
+ // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
+ {
+ string pathBase = Configuration["PATH_BASE"];
+
+ if (!string.IsNullOrEmpty(pathBase))
+ {
+ loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'");
+ app.UsePathBase(pathBase);
+ }
+
+ app.UseCors("CorsPolicy");
+
+ if (env.IsDevelopment())
+ {
+ app.UseDeveloperExceptionPage();
+ }
+
+ app.UseAuthentication();
+
+ app.UseMvc();
+
+ app.UseSwagger().UseSwaggerUI(c =>
+ {
+ c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Purchase BFF V1");
+ c.ConfigureOAuth2("Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregatorwaggerui", "", "", "Purchase BFF Swagger UI");
+ });
+ }
+ }
+
+ public static class ServiceCollectionExtensions
+ {
+ public static IServiceCollection AddCustomMvc(this IServiceCollection services, IConfiguration configuration)
+ {
+ services.AddOptions();
+ services.Configure(configuration.GetSection("urls"));
+
+ services
+ .AddMvc()
+ .SetCompatibilityVersion(AspNetCore.Mvc.CompatibilityVersion.Version_2_1)
+ ;
+
+ services.AddSwaggerGen(options =>
+ {
+ options.DescribeAllEnumsAsStrings();
+ options.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info
+ {
+ Title = "Shopping Aggregator for Mobile Clients",
+ Version = "v1",
+ Description = "Shopping Aggregator for Mobile Clients",
+ TermsOfService = "Terms Of Service"
+ });
+
+ options.AddSecurityDefinition("oauth2", new OAuth2Scheme
+ {
+ Type = "oauth2",
+ Flow = "implicit",
+ AuthorizationUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/authorize",
+ TokenUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/token",
+ Scopes = new Dictionary()
+ {
+ { "mobileshoppingagg", "Shopping Aggregator for Mobile Clients" }
+ }
+ });
+
+ options.OperationFilter();
+ });
+
+ services.AddCors(options =>
+ {
+ options.AddPolicy("CorsPolicy",
+ builder => builder.AllowAnyOrigin()
+ .AllowAnyMethod()
+ .AllowAnyHeader()
+ .AllowCredentials());
+ });
+
+ return services;
+ }
+ public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration)
+ {
+ JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
+ var identityUrl = configuration.GetValue("urls:identity");
+ services.AddAuthentication(options =>
+ {
+ options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
+ options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
+
+ }).AddJwtBearer(options =>
+ {
+ options.Authority = identityUrl;
+ options.RequireHttpsMetadata = false;
+ options.Audience = "mobileshoppingagg";
+ options.Events = new JwtBearerEvents()
+ {
+#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
+ OnAuthenticationFailed = async ctx =>
+#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
+ {
+ },
+#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
+ OnTokenValidated = async ctx =>
+#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
+ {
+ }
+ };
+ });
+
+ return services;
+ }
+ public static IServiceCollection AddHttpServices(this IServiceCollection services)
+ {
+ //register delegating handlers
+ services.AddTransient();
+ services.AddSingleton();
+
+ //register http services
+ services.AddHttpClient()
+ .AddHttpMessageHandler()
+ .AddPolicyHandler(GetRetryPolicy())
+ .AddPolicyHandler(GetCircuitBreakerPolicy());
+
+ services.AddHttpClient()
+ .AddPolicyHandler(GetRetryPolicy())
+ .AddPolicyHandler(GetCircuitBreakerPolicy());
+
+ services.AddHttpClient()
+ .AddPolicyHandler(GetRetryPolicy())
+ .AddPolicyHandler(GetCircuitBreakerPolicy());
+
+
+
+ return services;
+ }
+
+ static IAsyncPolicy GetRetryPolicy()
+ {
+ return HttpPolicyExtensions
+ .HandleTransientHttpError()
+ .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
+ .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
+
+ }
+ static IAsyncPolicy GetCircuitBreakerPolicy()
+ {
+ return HttpPolicyExtensions
+ .HandleTransientHttpError()
+ .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
+ }
+ }
}
diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile b/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile
index d4940d436..c9572c9ab 100644
--- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile
+++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile
@@ -1,8 +1,8 @@
-FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
+FROM microsoft/dotnet:2.1.3-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
-FROM microsoft/dotnet:2.1-sdk AS build
+FROM microsoft/dotnet:2.1.401-sdk AS build
WORKDIR /src
COPY . .
WORKDIR /src/src/ApiGateways/Web.Bff.Shopping/aggregator
diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Properties/launchSettings.json b/src/ApiGateways/Web.Bff.Shopping/aggregator/Properties/launchSettings.json
index 925e70b0d..adfd79888 100644
--- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Properties/launchSettings.json
+++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Properties/launchSettings.json
@@ -14,7 +14,8 @@
"launchUrl": "api/values",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
- }
+ },
+ "use64Bit": true
},
"PurchaseForMvc": {
"commandName": "Project",
diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs
index e4a080289..515641e34 100644
--- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs
+++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs
@@ -11,7 +11,6 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Polly;
using Polly.Extensions.Http;
-using Polly.Timeout;
using Swashbuckle.AspNetCore.Swagger;
using System;
using System.Collections.Generic;
@@ -20,168 +19,178 @@ using System.Net.Http;
namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator
{
- public class Startup
- {
- public Startup(IConfiguration configuration)
- {
- Configuration = configuration;
- }
-
- public IConfiguration Configuration { get; }
-
- // This method gets called by the runtime. Use this method to add services to the container.
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddCustomMvc(Configuration)
- .AddCustomAuthentication(Configuration)
- .AddApplicationServices();
- }
-
- // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
- public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
- {
- var pathBase = Configuration["PATH_BASE"];
- if (!string.IsNullOrEmpty(pathBase))
- {
- loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'");
- app.UsePathBase(pathBase);
- }
-
- app.UseCors("CorsPolicy");
-
- if (env.IsDevelopment())
- {
- app.UseDeveloperExceptionPage();
- }
-
- app.UseAuthentication();
-
- app.UseMvc();
-
- app.UseSwagger().UseSwaggerUI(c =>
- {
- c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Purchase BFF V1");
- //c.ConfigureOAuth2("Microsoft.eShopOnContainers.Web.Shopping.HttpAggregatorwaggerui", "", "", "Purchase BFF Swagger UI");
- });
-
-
- }
- }
-
- public static class ServiceCollectionExtensions
- {
- public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration)
- {
- JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
- var identityUrl = configuration.GetValue("urls:identity");
- services.AddAuthentication(options =>
- {
- options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
- options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
-
- }).AddJwtBearer(options =>
- {
- options.Authority = identityUrl;
- options.RequireHttpsMetadata = false;
- options.Audience = "webshoppingagg";
- options.Events = new JwtBearerEvents()
- {
- OnAuthenticationFailed = async ctx =>
- {
- int i = 0;
- },
- OnTokenValidated = async ctx =>
- {
- int i = 0;
- }
- };
- });
-
- return services;
- }
- public static IServiceCollection AddCustomMvc(this IServiceCollection services, IConfiguration configuration)
- {
- services.AddOptions();
- services.Configure(configuration.GetSection("urls"));
-
- services.AddMvc();
-
- services.AddSwaggerGen(options =>
- {
- options.DescribeAllEnumsAsStrings();
- options.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info
- {
- Title = "Shopping Aggregator for Web Clients",
- Version = "v1",
- Description = "Shopping Aggregator for Web Clients",
- TermsOfService = "Terms Of Service"
- });
-
- options.AddSecurityDefinition("oauth2", new OAuth2Scheme
- {
- Type = "oauth2",
- Flow = "implicit",
- AuthorizationUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/authorize",
- TokenUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/token",
- Scopes = new Dictionary()
- {
- { "webshoppingagg", "Shopping Aggregator for Web Clients" }
- }
- });
-
- options.OperationFilter();
- });
-
- services.AddCors(options =>
- {
- options.AddPolicy("CorsPolicy",
- builder => builder.AllowAnyOrigin()
- .AllowAnyMethod()
- .AllowAnyHeader()
- .AllowCredentials());
- });
-
- return services;
- }
- public static IServiceCollection AddApplicationServices(this IServiceCollection services)
- {
- //register delegating handlers
- services.AddTransient();
- services.AddSingleton();
-
- //register http services
-
- services.AddHttpClient()
- .AddHttpMessageHandler()
- .AddPolicyHandler(GetRetryPolicy())
- .AddPolicyHandler(GetCircuitBreakerPolicy());
-
- services.AddHttpClient()
- .AddPolicyHandler(GetRetryPolicy())
- .AddPolicyHandler(GetCircuitBreakerPolicy());
-
- services.AddHttpClient()
- .AddHttpMessageHandler()
- .AddPolicyHandler(GetRetryPolicy())
- .AddPolicyHandler(GetCircuitBreakerPolicy());
-
-
- return services;
- }
-
- static IAsyncPolicy GetRetryPolicy()
- {
- return HttpPolicyExtensions
- .HandleTransientHttpError()
- .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
- .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
-
- }
- static IAsyncPolicy GetCircuitBreakerPolicy()
- {
- return HttpPolicyExtensions
- .HandleTransientHttpError()
- .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
- }
- }
+ public class Startup
+ {
+ public Startup(IConfiguration configuration)
+ {
+ Configuration = configuration;
+ }
+
+ public IConfiguration Configuration { get; }
+
+ // This method gets called by the runtime. Use this method to add services to the container.
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services
+ .AddCustomMvc(Configuration)
+ .AddCustomAuthentication(Configuration)
+ .AddApplicationServices();
+ }
+
+ // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
+ {
+ var pathBase = Configuration["PATH_BASE"];
+ if (!string.IsNullOrEmpty(pathBase))
+ {
+ loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'");
+ app.UsePathBase(pathBase);
+ }
+
+ app.UseCors("CorsPolicy");
+
+ if (env.IsDevelopment())
+ {
+ app.UseDeveloperExceptionPage();
+ }
+ app.UseAuthentication();
+
+ app.UseMvc();
+
+ app.UseSwagger().UseSwaggerUI(c =>
+ {
+ c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Purchase BFF V1");
+ //c.ConfigureOAuth2("Microsoft.eShopOnContainers.Web.Shopping.HttpAggregatorwaggerui", "", "", "Purchase BFF Swagger UI");
+ });
+
+
+ }
+ }
+
+ public static class ServiceCollectionExtensions
+ {
+ public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration)
+ {
+ JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
+ string identityUrl = configuration.GetValue("urls:identity");
+ services.AddAuthentication(options =>
+ {
+ options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
+ options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
+
+ })
+ .AddJwtBearer(options =>
+ {
+ options.Authority = identityUrl;
+ options.RequireHttpsMetadata = false;
+ options.Audience = "webshoppingagg";
+ options.Events = new JwtBearerEvents()
+ {
+#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
+ OnAuthenticationFailed = async ctx =>
+#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
+ {
+ },
+#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
+ OnTokenValidated = async ctx =>
+#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
+ {
+ }
+ };
+ });
+
+ return services;
+ }
+ public static IServiceCollection AddCustomMvc(this IServiceCollection services, IConfiguration configuration)
+ {
+ services.AddOptions();
+ services.Configure(configuration.GetSection("urls"));
+
+ services
+ .AddMvc()
+ .SetCompatibilityVersion(AspNetCore.Mvc.CompatibilityVersion.Version_2_1)
+ ;
+
+ services.AddSwaggerGen(options =>
+ {
+ options.DescribeAllEnumsAsStrings();
+ options.SwaggerDoc("v1", new Info
+ {
+ Title = "Shopping Aggregator for Web Clients",
+ Version = "v1",
+ Description = "Shopping Aggregator for Web Clients",
+ TermsOfService = "Terms Of Service"
+ });
+
+ options.AddSecurityDefinition("oauth2", new OAuth2Scheme
+ {
+ Type = "oauth2",
+ Flow = "implicit",
+ AuthorizationUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/authorize",
+ TokenUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/token",
+ Scopes = new Dictionary()
+ {
+ { "webshoppingagg", "Shopping Aggregator for Web Clients" }
+ }
+ });
+
+ options.OperationFilter();
+ });
+
+ services.AddCors(options =>
+ {
+ options
+ .AddPolicy(
+ "CorsPolicy",
+ builder =>
+ builder
+ .AllowAnyOrigin()
+ .AllowAnyMethod()
+ .AllowAnyHeader()
+ .AllowCredentials());
+ });
+
+ return services;
+ }
+ public static IServiceCollection AddApplicationServices(this IServiceCollection services)
+ {
+ //register delegating handlers
+ services.AddTransient();
+ services.AddHttpContextAccessor();
+
+ //register http services
+
+ services.AddHttpClient()
+ .AddHttpMessageHandler()
+ .AddPolicyHandler(GetRetryPolicy())
+ .AddPolicyHandler(GetCircuitBreakerPolicy());
+
+ services.AddHttpClient()
+ .AddPolicyHandler(GetRetryPolicy())
+ .AddPolicyHandler(GetCircuitBreakerPolicy());
+
+ services.AddHttpClient()
+ .AddHttpMessageHandler()
+ .AddPolicyHandler(GetRetryPolicy())
+ .AddPolicyHandler(GetCircuitBreakerPolicy());
+
+
+ return services;
+ }
+
+ static IAsyncPolicy GetRetryPolicy()
+ {
+ return HttpPolicyExtensions
+ .HandleTransientHttpError()
+ .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
+ .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
+
+ }
+ static IAsyncPolicy GetCircuitBreakerPolicy()
+ {
+ return HttpPolicyExtensions
+ .HandleTransientHttpError()
+ .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
+ }
+ }
}
diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj b/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj
index 7a0f6cc01..7150eb320 100644
--- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj
+++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj
@@ -1,21 +1,23 @@
-
- netcoreapp2.1
- Web.Shopping.HttpAggregator
- Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator
- ..\..\..\docker-compose.dcproj
-
+
+ netcoreapp2.1
+ 2.1.3
+ Web.Shopping.HttpAggregator
+ Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator
+ ..\..\..\docker-compose.dcproj
+ 0890cb23-79b5-408d-9aeb-13e6ff218d71
+
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj b/src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj
index 5ffc3c9eb..80c1e7035 100644
--- a/src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj
+++ b/src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj
@@ -6,10 +6,10 @@
-
-
-
-
+
+
+
+
diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/Microsoft.AspNetCore.HealthChecks.csproj b/src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/Microsoft.AspNetCore.HealthChecks.csproj
index ce659345f..6d177205d 100644
--- a/src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/Microsoft.AspNetCore.HealthChecks.csproj
+++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/Microsoft.AspNetCore.HealthChecks.csproj
@@ -13,7 +13,7 @@
-
+
\ No newline at end of file
diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/Microsoft.Extensions.HealthChecks.AzureStorage.csproj b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/Microsoft.Extensions.HealthChecks.AzureStorage.csproj
index 844098052..6c282d3b9 100644
--- a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/Microsoft.Extensions.HealthChecks.AzureStorage.csproj
+++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/Microsoft.Extensions.HealthChecks.AzureStorage.csproj
@@ -16,11 +16,11 @@
-
+
-
-
+
+
diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj
index 5e63cac75..609ded8cd 100644
--- a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj
+++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj
@@ -9,12 +9,12 @@
-
+
-
+
diff --git a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj
index ad891e6bd..bc37e16dc 100644
--- a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj
+++ b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj
@@ -6,7 +6,7 @@
-
+
diff --git a/src/Services/Basket/Basket.API/Basket.API.csproj b/src/Services/Basket/Basket.API/Basket.API.csproj
index 36fc95496..746ac9d71 100644
--- a/src/Services/Basket/Basket.API/Basket.API.csproj
+++ b/src/Services/Basket/Basket.API/Basket.API.csproj
@@ -1,36 +1,37 @@
-
- netcoreapp2.1
- $(AssetTargetFallback);portable-net45+win8+wp8+wpa81;
- ..\..\..\..\docker-compose.dcproj
-
+
+ netcoreapp2.1
+ 2.1.3
+ $(AssetTargetFallback);portable-net45+win8+wp8+wpa81;
+ ..\..\..\..\docker-compose.dcproj
+
-
-
- PreserveNewest
-
-
+
+
+ PreserveNewest
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/Services/Basket/Basket.API/Dockerfile b/src/Services/Basket/Basket.API/Dockerfile
index 7027cfc2d..b2e124070 100644
--- a/src/Services/Basket/Basket.API/Dockerfile
+++ b/src/Services/Basket/Basket.API/Dockerfile
@@ -1,8 +1,8 @@
-FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
+FROM microsoft/dotnet:2.1.3-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
-FROM microsoft/dotnet:2.1-sdk AS build
+FROM microsoft/dotnet:2.1.401-sdk AS build
WORKDIR /src
COPY . .
WORKDIR /src/src/Services/Basket/Basket.API
diff --git a/src/Services/Basket/Basket.API/Properties/launchSettings.json b/src/Services/Basket/Basket.API/Properties/launchSettings.json
index 60a56b153..f2b851cc1 100644
--- a/src/Services/Basket/Basket.API/Properties/launchSettings.json
+++ b/src/Services/Basket/Basket.API/Properties/launchSettings.json
@@ -14,7 +14,8 @@
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
- }
+ },
+ "use64Bit": true
},
"Microsoft.eShopOnContainers.Services.Basket.API": {
"commandName": "Project",
diff --git a/src/Services/Basket/Basket.API/Startup.cs b/src/Services/Basket/Basket.API/Startup.cs
index 7d65ba8b4..874bade77 100644
--- a/src/Services/Basket/Basket.API/Startup.cs
+++ b/src/Services/Basket/Basket.API/Startup.cs
@@ -34,281 +34,283 @@ using System.Threading.Tasks;
namespace Microsoft.eShopOnContainers.Services.Basket.API
{
- public class Startup
- {
- public Startup(IConfiguration configuration)
- {
- Configuration = configuration;
- }
-
- public IConfiguration Configuration { get; }
-
-
- // This method gets called by the runtime. Use this method to add services to the container.
- public IServiceProvider ConfigureServices(IServiceCollection services)
- {
- RegisterAppInsights(services);
-
- // Add framework services.
- services.AddMvc(options =>
- {
- options.Filters.Add(typeof(HttpGlobalExceptionFilter));
- options.Filters.Add(typeof(ValidateModelStateFilter));
-
- }).AddControllersAsServices();
-
- ConfigureAuthService(services);
-
- services.AddHealthChecks(checks =>
- {
- checks.AddValueTaskCheck("HTTP Endpoint", () => new ValueTask(HealthCheckResult.Healthy("Ok")),
- TimeSpan.Zero //No cache for this HealthCheck, better just for demos
- );
- });
-
- services.Configure(Configuration);
-
- //By connecting here we are making sure that our service
- //cannot start until redis is ready. This might slow down startup,
- //but given that there is a delay on resolving the ip address
- //and then creating the connection it seems reasonable to move
- //that cost to startup instead of having the first request pay the
- //penalty.
- services.AddSingleton(sp =>
- {
- var settings = sp.GetRequiredService>().Value;
- var configuration = ConfigurationOptions.Parse(settings.ConnectionString, true);
-
- configuration.ResolveDns = true;
-
- return ConnectionMultiplexer.Connect(configuration);
- });
-
-
- if (Configuration.GetValue("AzureServiceBusEnabled"))
- {
- services.AddSingleton(sp =>
- {
- var logger = sp.GetRequiredService>();
-
- var serviceBusConnectionString = Configuration["EventBusConnection"];
- var serviceBusConnection = new ServiceBusConnectionStringBuilder(serviceBusConnectionString);
-
- return new DefaultServiceBusPersisterConnection(serviceBusConnection, logger);
- });
- }
- else
- {
- services.AddSingleton(sp =>
- {
- var logger = sp.GetRequiredService>();
-
- var factory = new ConnectionFactory()
- {
- HostName = Configuration["EventBusConnection"]
- };
-
- if (!string.IsNullOrEmpty(Configuration["EventBusUserName"]))
- {
- factory.UserName = Configuration["EventBusUserName"];
- }
-
- if (!string.IsNullOrEmpty(Configuration["EventBusPassword"]))
- {
- factory.Password = Configuration["EventBusPassword"];
- }
-
- var retryCount = 5;
- if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"]))
- {
- retryCount = int.Parse(Configuration["EventBusRetryCount"]);
- }
-
- return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount);
- });
- }
-
- RegisterEventBus(services);
-
- services.AddSwaggerGen(options =>
- {
- options.DescribeAllEnumsAsStrings();
- options.SwaggerDoc("v1", new Info
- {
- Title = "Basket HTTP API",
- Version = "v1",
- Description = "The Basket Service HTTP API",
- TermsOfService = "Terms Of Service"
- });
-
- options.AddSecurityDefinition("oauth2", new OAuth2Scheme
- {
- Type = "oauth2",
- Flow = "implicit",
- AuthorizationUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/authorize",
- TokenUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/token",
- Scopes = new Dictionary()
- {
- { "basket", "Basket API" }
- }
- });
-
- options.OperationFilter();
- });
-
- services.AddCors(options =>
- {
- options.AddPolicy("CorsPolicy",
- builder => builder.AllowAnyOrigin()
- .AllowAnyMethod()
- .AllowAnyHeader()
- .AllowCredentials());
- });
- services.AddSingleton();
- services.AddTransient();
- services.AddTransient();
-
- services.AddOptions();
-
- var container = new ContainerBuilder();
- container.Populate(services);
-
- return new AutofacServiceProvider(container.Build());
- }
-
-
- // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
- public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
- {
- loggerFactory.AddAzureWebAppDiagnostics();
- loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace);
-
- var pathBase = Configuration["PATH_BASE"];
- if (!string.IsNullOrEmpty(pathBase))
- {
- app.UsePathBase(pathBase);
- }
+ public class Startup
+ {
+ public Startup(IConfiguration configuration)
+ {
+ Configuration = configuration;
+ }
+
+ public IConfiguration Configuration { get; }
+
+
+ // This method gets called by the runtime. Use this method to add services to the container.
+ public IServiceProvider ConfigureServices(IServiceCollection services)
+ {
+ RegisterAppInsights(services);
+
+ // Add framework services.
+ services.AddMvc(options =>
+ {
+ options.Filters.Add(typeof(HttpGlobalExceptionFilter));
+ options.Filters.Add(typeof(ValidateModelStateFilter));
+ })
+ .AddControllersAsServices()
+ .SetCompatibilityVersion(AspNetCore.Mvc.CompatibilityVersion.Version_2_1)
+ ;
+
+ ConfigureAuthService(services);
+
+ services.AddHealthChecks(checks =>
+ {
+ checks.AddValueTaskCheck("HTTP Endpoint", () => new ValueTask(HealthCheckResult.Healthy("Ok")),
+ TimeSpan.Zero //No cache for this HealthCheck, better just for demos
+ );
+ });
+
+ services.Configure(Configuration);
+
+ //By connecting here we are making sure that our service
+ //cannot start until redis is ready. This might slow down startup,
+ //but given that there is a delay on resolving the ip address
+ //and then creating the connection it seems reasonable to move
+ //that cost to startup instead of having the first request pay the
+ //penalty.
+ services.AddSingleton(sp =>
+ {
+ var settings = sp.GetRequiredService>().Value;
+ var configuration = ConfigurationOptions.Parse(settings.ConnectionString, true);
+
+ configuration.ResolveDns = true;
+
+ return ConnectionMultiplexer.Connect(configuration);
+ });
+
+
+ if (Configuration.GetValue("AzureServiceBusEnabled"))
+ {
+ services.AddSingleton(sp =>
+ {
+ var logger = sp.GetRequiredService>();
+
+ var serviceBusConnectionString = Configuration["EventBusConnection"];
+ var serviceBusConnection = new ServiceBusConnectionStringBuilder(serviceBusConnectionString);
+
+ return new DefaultServiceBusPersisterConnection(serviceBusConnection, logger);
+ });
+ }
+ else
+ {
+ services.AddSingleton(sp =>
+ {
+ var logger = sp.GetRequiredService>();
+
+ var factory = new ConnectionFactory()
+ {
+ HostName = Configuration["EventBusConnection"]
+ };
+
+ if (!string.IsNullOrEmpty(Configuration["EventBusUserName"]))
+ {
+ factory.UserName = Configuration["EventBusUserName"];
+ }
+
+ if (!string.IsNullOrEmpty(Configuration["EventBusPassword"]))
+ {
+ factory.Password = Configuration["EventBusPassword"];
+ }
+
+ var retryCount = 5;
+ if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"]))
+ {
+ retryCount = int.Parse(Configuration["EventBusRetryCount"]);
+ }
+
+ return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount);
+ });
+ }
+
+ RegisterEventBus(services);
+
+ services.AddSwaggerGen(options =>
+ {
+ options.DescribeAllEnumsAsStrings();
+ options.SwaggerDoc("v1", new Info
+ {
+ Title = "Basket HTTP API",
+ Version = "v1",
+ Description = "The Basket Service HTTP API",
+ TermsOfService = "Terms Of Service"
+ });
+
+ options.AddSecurityDefinition("oauth2", new OAuth2Scheme
+ {
+ Type = "oauth2",
+ Flow = "implicit",
+ AuthorizationUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/authorize",
+ TokenUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/token",
+ Scopes = new Dictionary()
+ {
+ { "basket", "Basket API" }
+ }
+ });
+
+ options.OperationFilter();
+ });
+
+ services.AddCors(options =>
+ {
+ options.AddPolicy("CorsPolicy",
+ builder => builder.AllowAnyOrigin()
+ .AllowAnyMethod()
+ .AllowAnyHeader()
+ .AllowCredentials());
+ });
+ services.AddSingleton();
+ services.AddTransient();
+ services.AddTransient();
+
+ services.AddOptions();
+
+ var container = new ContainerBuilder();
+ container.Populate(services);
+
+ return new AutofacServiceProvider(container.Build());
+ }
+
+
+ // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
+ {
+ loggerFactory.AddAzureWebAppDiagnostics();
+ loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace);
+
+ var pathBase = Configuration["PATH_BASE"];
+ if (!string.IsNullOrEmpty(pathBase))
+ {
+ app.UsePathBase(pathBase);
+ }
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
- app.Map("/liveness", lapp => lapp.Run(async ctx => ctx.Response.StatusCode = 200));
+ app.Map("/liveness", lapp => lapp.Run(async ctx => ctx.Response.StatusCode = 200));
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
- app.UseStaticFiles();
- app.UseCors("CorsPolicy");
-
- ConfigureAuth(app);
-
- app.UseMvcWithDefaultRoute();
-
- app.UseSwagger()
- .UseSwaggerUI(c =>
- {
- c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Basket.API V1");
- c.OAuthClientId ("basketswaggerui");
- c.OAuthAppName("Basket Swagger UI");
- });
-
- ConfigureEventBus(app);
-
- }
-
- private void RegisterAppInsights(IServiceCollection services)
- {
- services.AddApplicationInsightsTelemetry(Configuration);
- var orchestratorType = Configuration.GetValue("OrchestratorType");
-
- if (orchestratorType?.ToUpper() == "K8S")
- {
- // Enable K8s telemetry initializer
- services.EnableKubernetes();
- }
- if (orchestratorType?.ToUpper() == "SF")
- {
- // Enable SF telemetry initializer
- services.AddSingleton((serviceProvider) =>
- new FabricTelemetryInitializer());
- }
- }
-
- private void ConfigureAuthService(IServiceCollection services)
- {
- // prevent from mapping "sub" claim to nameidentifier.
- JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
-
- var identityUrl = Configuration.GetValue("IdentityUrl");
-
- services.AddAuthentication(options =>
- {
- options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
- options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
-
- }).AddJwtBearer(options =>
- {
- options.Authority = identityUrl;
- options.RequireHttpsMetadata = false;
- options.Audience = "basket";
- });
- }
-
- protected virtual void ConfigureAuth(IApplicationBuilder app)
- {
- if (Configuration.GetValue("UseLoadTest"))
- {
- app.UseMiddleware();
- }
-
- app.UseAuthentication();
- }
-
- private void RegisterEventBus(IServiceCollection services)
- {
- var subscriptionClientName = Configuration["SubscriptionClientName"];
-
- if (Configuration.GetValue("AzureServiceBusEnabled"))
- {
- services.AddSingleton(sp =>
- {
- var serviceBusPersisterConnection = sp.GetRequiredService();
- var iLifetimeScope = sp.GetRequiredService();
- var logger = sp.GetRequiredService>();
- var eventBusSubcriptionsManager = sp.GetRequiredService();
-
- return new EventBusServiceBus(serviceBusPersisterConnection, logger,
- eventBusSubcriptionsManager, subscriptionClientName, iLifetimeScope);
- });
- }
- else
- {
- services.AddSingleton(sp =>
- {
- var rabbitMQPersistentConnection = sp.GetRequiredService();
- var iLifetimeScope = sp.GetRequiredService();
- var logger = sp.GetRequiredService>();
- var eventBusSubcriptionsManager = sp.GetRequiredService();
-
- var retryCount = 5;
- if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"]))
- {
- retryCount = int.Parse(Configuration["EventBusRetryCount"]);
- }
-
- return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, subscriptionClientName, retryCount);
- });
- }
-
- services.AddSingleton();
-
- services.AddTransient();
- services.AddTransient();
- }
-
- private void ConfigureEventBus(IApplicationBuilder app)
- {
- var eventBus = app.ApplicationServices.GetRequiredService();
-
- eventBus.Subscribe();
- eventBus.Subscribe();
- }
- }
+ app.UseStaticFiles();
+ app.UseCors("CorsPolicy");
+
+ ConfigureAuth(app);
+
+ app.UseMvcWithDefaultRoute();
+
+ app.UseSwagger()
+ .UseSwaggerUI(c =>
+ {
+ c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Basket.API V1");
+ c.OAuthClientId("basketswaggerui");
+ c.OAuthAppName("Basket Swagger UI");
+ });
+
+ ConfigureEventBus(app);
+
+ }
+
+ private void RegisterAppInsights(IServiceCollection services)
+ {
+ services.AddApplicationInsightsTelemetry(Configuration);
+ var orchestratorType = Configuration.GetValue("OrchestratorType");
+
+ if (orchestratorType?.ToUpper() == "K8S")
+ {
+ // Enable K8s telemetry initializer
+ services.EnableKubernetes();
+ }
+ if (orchestratorType?.ToUpper() == "SF")
+ {
+ // Enable SF telemetry initializer
+ services.AddSingleton((serviceProvider) =>
+ new FabricTelemetryInitializer());
+ }
+ }
+
+ private void ConfigureAuthService(IServiceCollection services)
+ {
+ // prevent from mapping "sub" claim to nameidentifier.
+ JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
+
+ var identityUrl = Configuration.GetValue("IdentityUrl");
+
+ services.AddAuthentication(options =>
+ {
+ options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
+ options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
+
+ }).AddJwtBearer(options =>
+ {
+ options.Authority = identityUrl;
+ options.RequireHttpsMetadata = false;
+ options.Audience = "basket";
+ });
+ }
+
+ protected virtual void ConfigureAuth(IApplicationBuilder app)
+ {
+ if (Configuration.GetValue("UseLoadTest"))
+ {
+ app.UseMiddleware();
+ }
+
+ app.UseAuthentication();
+ }
+
+ private void RegisterEventBus(IServiceCollection services)
+ {
+ var subscriptionClientName = Configuration["SubscriptionClientName"];
+
+ if (Configuration.GetValue("AzureServiceBusEnabled"))
+ {
+ services.AddSingleton(sp =>
+ {
+ var serviceBusPersisterConnection = sp.GetRequiredService();
+ var iLifetimeScope = sp.GetRequiredService();
+ var logger = sp.GetRequiredService>();
+ var eventBusSubcriptionsManager = sp.GetRequiredService();
+
+ return new EventBusServiceBus(serviceBusPersisterConnection, logger,
+ eventBusSubcriptionsManager, subscriptionClientName, iLifetimeScope);
+ });
+ }
+ else
+ {
+ services.AddSingleton(sp =>
+ {
+ var rabbitMQPersistentConnection = sp.GetRequiredService();
+ var iLifetimeScope = sp.GetRequiredService();
+ var logger = sp.GetRequiredService>();
+ var eventBusSubcriptionsManager = sp.GetRequiredService();
+
+ var retryCount = 5;
+ if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"]))
+ {
+ retryCount = int.Parse(Configuration["EventBusRetryCount"]);
+ }
+
+ return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, subscriptionClientName, retryCount);
+ });
+ }
+
+ services.AddSingleton();
+
+ services.AddTransient();
+ services.AddTransient();
+ }
+
+ private void ConfigureEventBus(IApplicationBuilder app)
+ {
+ var eventBus = app.ApplicationServices.GetRequiredService();
+
+ eventBus.Subscribe();
+ eventBus.Subscribe();
+ }
+ }
}
diff --git a/src/Services/Basket/Basket.API/appsettings.json b/src/Services/Basket/Basket.API/appsettings.json
index 4bff4d70d..7db3bf6d8 100644
--- a/src/Services/Basket/Basket.API/appsettings.json
+++ b/src/Services/Basket/Basket.API/appsettings.json
@@ -1,24 +1,24 @@
{
- "Logging": {
- "IncludeScopes": false,
- "LogLevel": {
- "Default": "Debug",
- "System": "Information",
- "Microsoft": "Information"
- }
- },
- "IdentityUrl": "http://localhost:5105",
- "ConnectionString": "127.0.0.1",
- "AzureServiceBusEnabled": false,
- "SubscriptionClientName": "Basket",
- "ApplicationInsights": {
- "InstrumentationKey": ""
- },
- "EventBusRetryCount": 5,
- "UseVault": false,
- "Vault": {
- "Name": "eshop",
- "ClientId": "your-clien-id",
- "ClientSecret": "your-client-secret"
- }
+ "Logging": {
+ "IncludeScopes": false,
+ "LogLevel": {
+ "Default": "Debug",
+ "System": "Information",
+ "Microsoft": "Information"
+ }
+ },
+ "IdentityUrl": "https://localhost:4105",
+ "ConnectionString": "127.0.0.1",
+ "AzureServiceBusEnabled": false,
+ "SubscriptionClientName": "Basket",
+ "ApplicationInsights": {
+ "InstrumentationKey": ""
+ },
+ "EventBusRetryCount": 5,
+ "UseVault": false,
+ "Vault": {
+ "Name": "eshop",
+ "ClientId": "your-clien-id",
+ "ClientSecret": "your-client-secret"
+ }
}
\ No newline at end of file
diff --git a/src/Services/Catalog/Catalog.API/Catalog.API.csproj b/src/Services/Catalog/Catalog.API/Catalog.API.csproj
index 90abe593a..9aede66bf 100644
--- a/src/Services/Catalog/Catalog.API/Catalog.API.csproj
+++ b/src/Services/Catalog/Catalog.API/Catalog.API.csproj
@@ -35,13 +35,13 @@
-
-
+
+
-
-
-
-
+
+
+
+
diff --git a/src/Services/Catalog/Catalog.API/Dockerfile b/src/Services/Catalog/Catalog.API/Dockerfile
index 4cbc9c8aa..e21218e69 100644
--- a/src/Services/Catalog/Catalog.API/Dockerfile
+++ b/src/Services/Catalog/Catalog.API/Dockerfile
@@ -1,8 +1,8 @@
-FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
+FROM microsoft/dotnet:2.1.3-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
-FROM microsoft/dotnet:2.1-sdk AS build
+FROM microsoft/dotnet:2.1.401-sdk AS build
WORKDIR /src
COPY . .
WORKDIR /src/src/Services/Catalog/Catalog.API
diff --git a/src/Services/Catalog/Catalog.API/Properties/launchSettings.json b/src/Services/Catalog/Catalog.API/Properties/launchSettings.json
index 2b21ca280..658fc7d23 100644
--- a/src/Services/Catalog/Catalog.API/Properties/launchSettings.json
+++ b/src/Services/Catalog/Catalog.API/Properties/launchSettings.json
@@ -14,7 +14,8 @@
"launchUrl": "/swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
- }
+ },
+ "use64Bit": true
},
"Microsoft.eShopOnContainers.Services.Catalog.API": {
"commandName": "Project",
diff --git a/src/Services/Catalog/Catalog.API/Startup.cs b/src/Services/Catalog/Catalog.API/Startup.cs
index 408f870af..91c5a5ad2 100644
--- a/src/Services/Catalog/Catalog.API/Startup.cs
+++ b/src/Services/Catalog/Catalog.API/Startup.cs
@@ -32,299 +32,302 @@ using System.Reflection;
namespace Microsoft.eShopOnContainers.Services.Catalog.API
{
- public class Startup
- {
- public Startup(IConfiguration configuration)
- {
- Configuration = configuration;
- }
-
- public IConfiguration Configuration { get; }
-
- public IServiceProvider ConfigureServices(IServiceCollection services)
- {
- services.AddAppInsight(Configuration)
- .AddCustomMVC(Configuration)
- .AddCustomDbContext(Configuration)
- .AddCustomOptions(Configuration)
- .AddIntegrationServices(Configuration)
- .AddEventBus(Configuration)
- .AddSwagger();
-
- var container = new ContainerBuilder();
- container.Populate(services);
- return new AutofacServiceProvider(container.Build());
-
- }
-
- public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
- {
- //Configure logs
-
- loggerFactory.AddAzureWebAppDiagnostics();
- loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace);
-
- var pathBase = Configuration["PATH_BASE"];
-
- if (!string.IsNullOrEmpty(pathBase))
- {
- loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'");
- app.UsePathBase(pathBase);
- }
+ public class Startup
+ {
+ public Startup(IConfiguration configuration)
+ {
+ Configuration = configuration;
+ }
+
+ public IConfiguration Configuration { get; }
+
+ public IServiceProvider ConfigureServices(IServiceCollection services)
+ {
+ services.AddAppInsight(Configuration)
+ .AddCustomMVC(Configuration)
+ .AddCustomDbContext(Configuration)
+ .AddCustomOptions(Configuration)
+ .AddIntegrationServices(Configuration)
+ .AddEventBus(Configuration)
+ .AddSwagger();
+
+ var container = new ContainerBuilder();
+ container.Populate(services);
+ return new AutofacServiceProvider(container.Build());
+
+ }
+
+ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
+ {
+ //Configure logs
+
+ loggerFactory.AddAzureWebAppDiagnostics();
+ loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace);
+
+ var pathBase = Configuration["PATH_BASE"];
+
+ if (!string.IsNullOrEmpty(pathBase))
+ {
+ loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'");
+ app.UsePathBase(pathBase);
+ }
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
- app.Map("/liveness", lapp => lapp.Run(async ctx => ctx.Response.StatusCode = 200));
+ app.Map("/liveness", lapp => lapp.Run(async ctx => ctx.Response.StatusCode = 200));
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
- app.UseCors("CorsPolicy");
-
- app.UseMvcWithDefaultRoute();
-
- app.UseSwagger()
- .UseSwaggerUI(c =>
- {
- c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Catalog.API V1");
- });
-
- ConfigureEventBus(app);
- }
-
- protected virtual void ConfigureEventBus(IApplicationBuilder app)
- {
- var eventBus = app.ApplicationServices.GetRequiredService();
- eventBus.Subscribe();
- eventBus.Subscribe();
- }
- }
-
- public static class CustomExtensionMethods
- {
- public static IServiceCollection AddAppInsight(this IServiceCollection services, IConfiguration configuration)
- {
- services.AddApplicationInsightsTelemetry(configuration);
- var orchestratorType = configuration.GetValue("OrchestratorType");
-
- if (orchestratorType?.ToUpper() == "K8S")
- {
- // Enable K8s telemetry initializer
- services.EnableKubernetes();
- }
- if (orchestratorType?.ToUpper() == "SF")
- {
- // Enable SF telemetry initializer
- services.AddSingleton((serviceProvider) =>
- new FabricTelemetryInitializer());
- }
-
- return services;
- }
-
- public static IServiceCollection AddCustomMVC(this IServiceCollection services, IConfiguration configuration)
- {
- services.AddHealthChecks(checks =>
- {
- var minutes = 1;
- if (int.TryParse(configuration["HealthCheck:Timeout"], out var minutesParsed))
- {
- minutes = minutesParsed;
- }
- checks.AddSqlCheck("CatalogDb", configuration["ConnectionString"], TimeSpan.FromMinutes(minutes));
-
- var accountName = configuration.GetValue("AzureStorageAccountName");
- var accountKey = configuration.GetValue("AzureStorageAccountKey");
- if (!string.IsNullOrEmpty(accountName) && !string.IsNullOrEmpty(accountKey))
- {
- checks.AddAzureBlobStorageCheck(accountName, accountKey);
- }
- });
-
- services.AddMvc(options =>
- {
- options.Filters.Add(typeof(HttpGlobalExceptionFilter));
- }).AddControllersAsServices();
-
- services.AddCors(options =>
- {
- options.AddPolicy("CorsPolicy",
- builder => builder.AllowAnyOrigin()
- .AllowAnyMethod()
- .AllowAnyHeader()
- .AllowCredentials());
- });
-
- return services;
- }
-
- public static IServiceCollection AddCustomDbContext(this IServiceCollection services, IConfiguration configuration)
- {
- services.AddDbContext(options =>
- {
- options.UseSqlServer(configuration["ConnectionString"],
- sqlServerOptionsAction: sqlOptions =>
- {
- sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name);
- //Configuring Connection Resiliency: https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency
- sqlOptions.EnableRetryOnFailure(maxRetryCount: 10, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null);
- });
-
- // Changing default behavior when client evaluation occurs to throw.
- // Default in EF Core would be to log a warning when client evaluation is performed.
- options.ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));
- //Check Client vs. Server evaluation: https://docs.microsoft.com/en-us/ef/core/querying/client-eval
- });
-
- services.AddDbContext(options =>
- {
- options.UseSqlServer(configuration["ConnectionString"],
- sqlServerOptionsAction: sqlOptions =>
- {
- sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name);
- //Configuring Connection Resiliency: https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency
- sqlOptions.EnableRetryOnFailure(maxRetryCount: 10, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null);
- });
- });
-
- return services;
- }
-
- public static IServiceCollection AddCustomOptions(this IServiceCollection services, IConfiguration configuration)
- {
- services.Configure(configuration);
- services.Configure(options =>
- {
- options.InvalidModelStateResponseFactory = context =>
- {
- var problemDetails = new ValidationProblemDetails(context.ModelState)
- {
- Instance = context.HttpContext.Request.Path,
- Status = StatusCodes.Status400BadRequest,
- Detail = "Please refer to the errors property for additional details."
- };
-
- return new BadRequestObjectResult(problemDetails)
- {
- ContentTypes = { "application/problem+json", "application/problem+xml" }
- };
- };
- });
-
- return services;
- }
-
- public static IServiceCollection AddSwagger(this IServiceCollection services)
- {
- services.AddSwaggerGen(options =>
- {
- options.DescribeAllEnumsAsStrings();
- options.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info
- {
- Title = "eShopOnContainers - Catalog HTTP API",
- Version = "v1",
- Description = "The Catalog Microservice HTTP API. This is a Data-Driven/CRUD microservice sample",
- TermsOfService = "Terms Of Service"
- });
- });
-
- return services;
-
- }
-
- public static IServiceCollection AddIntegrationServices(this IServiceCollection services, IConfiguration configuration)
- {
- services.AddTransient>(
- sp => (DbConnection c) => new IntegrationEventLogService(c));
-
- services.AddTransient();
-
- if (configuration.GetValue("AzureServiceBusEnabled"))
- {
- services.AddSingleton(sp =>
- {
- var settings = sp.GetRequiredService>().Value;
- var logger = sp.GetRequiredService>();
-
- var serviceBusConnection = new ServiceBusConnectionStringBuilder(settings.EventBusConnection);
-
- return new DefaultServiceBusPersisterConnection(serviceBusConnection, logger);
- });
- }
- else
- {
- services.AddSingleton(sp =>
- {
- var settings = sp.GetRequiredService>().Value;
- var logger = sp.GetRequiredService>();
-
- var factory = new ConnectionFactory()
- {
- HostName = configuration["EventBusConnection"]
- };
-
- if (!string.IsNullOrEmpty(configuration["EventBusUserName"]))
- {
- factory.UserName = configuration["EventBusUserName"];
- }
-
- if (!string.IsNullOrEmpty(configuration["EventBusPassword"]))
- {
- factory.Password = configuration["EventBusPassword"];
- }
-
- var retryCount = 5;
- if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"]))
- {
- retryCount = int.Parse(configuration["EventBusRetryCount"]);
- }
-
- return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount);
- });
- }
-
- return services;
- }
-
- public static IServiceCollection AddEventBus(this IServiceCollection services, IConfiguration configuration)
- {
- var subscriptionClientName = configuration["SubscriptionClientName"];
-
- if (configuration.GetValue("AzureServiceBusEnabled"))
- {
- services.AddSingleton(sp =>
- {
- var serviceBusPersisterConnection = sp.GetRequiredService();
- var iLifetimeScope = sp.GetRequiredService();
- var logger = sp.GetRequiredService>();
- var eventBusSubcriptionsManager = sp.GetRequiredService();
-
- return new EventBusServiceBus(serviceBusPersisterConnection, logger,
- eventBusSubcriptionsManager, subscriptionClientName, iLifetimeScope);
- });
-
- }
- else
- {
- services.AddSingleton(sp =>
- {
- var rabbitMQPersistentConnection = sp.GetRequiredService();
- var iLifetimeScope = sp.GetRequiredService();
- var logger = sp.GetRequiredService>();
- var eventBusSubcriptionsManager = sp.GetRequiredService();
-
- var retryCount = 5;
- if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"]))
- {
- retryCount = int.Parse(configuration["EventBusRetryCount"]);
- }
-
- return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, subscriptionClientName, retryCount);
- });
- }
-
- services.AddSingleton();
- services.AddTransient();
- services.AddTransient();
-
- return services;
- }
- }
+ app.UseCors("CorsPolicy");
+
+ app.UseMvcWithDefaultRoute();
+
+ app.UseSwagger()
+ .UseSwaggerUI(c =>
+ {
+ c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Catalog.API V1");
+ });
+
+ ConfigureEventBus(app);
+ }
+
+ protected virtual void ConfigureEventBus(IApplicationBuilder app)
+ {
+ var eventBus = app.ApplicationServices.GetRequiredService();
+ eventBus.Subscribe();
+ eventBus.Subscribe();
+ }
+ }
+
+ public static class CustomExtensionMethods
+ {
+ public static IServiceCollection AddAppInsight(this IServiceCollection services, IConfiguration configuration)
+ {
+ services.AddApplicationInsightsTelemetry(configuration);
+ var orchestratorType = configuration.GetValue("OrchestratorType");
+
+ if (orchestratorType?.ToUpper() == "K8S")
+ {
+ // Enable K8s telemetry initializer
+ services.EnableKubernetes();
+ }
+ if (orchestratorType?.ToUpper() == "SF")
+ {
+ // Enable SF telemetry initializer
+ services.AddSingleton((serviceProvider) =>
+ new FabricTelemetryInitializer());
+ }
+
+ return services;
+ }
+
+ public static IServiceCollection AddCustomMVC(this IServiceCollection services, IConfiguration configuration)
+ {
+ services.AddHealthChecks(checks =>
+ {
+ var minutes = 1;
+ if (int.TryParse(configuration["HealthCheck:Timeout"], out int minutesParsed))
+ {
+ minutes = minutesParsed;
+ }
+ checks.AddSqlCheck("CatalogDb", configuration["ConnectionString"], TimeSpan.FromMinutes(minutes));
+
+ var accountName = configuration.GetValue("AzureStorageAccountName");
+ var accountKey = configuration.GetValue("AzureStorageAccountKey");
+ if (!string.IsNullOrEmpty(accountName) && !string.IsNullOrEmpty(accountKey))
+ {
+ checks.AddAzureBlobStorageCheck(accountName, accountKey);
+ }
+ });
+
+ services.AddMvc(options =>
+ {
+ options.Filters.Add(typeof(HttpGlobalExceptionFilter));
+ })
+ .AddControllersAsServices()
+ .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
+ ;
+
+ services.AddCors(options =>
+ {
+ options.AddPolicy("CorsPolicy",
+ builder => builder.AllowAnyOrigin()
+ .AllowAnyMethod()
+ .AllowAnyHeader()
+ .AllowCredentials());
+ });
+
+ return services;
+ }
+
+ public static IServiceCollection AddCustomDbContext(this IServiceCollection services, IConfiguration configuration)
+ {
+ services.AddDbContext(options =>
+ {
+ options.UseSqlServer(configuration["ConnectionString"],
+ sqlServerOptionsAction: sqlOptions =>
+ {
+ sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name);
+ //Configuring Connection Resiliency: https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency
+ sqlOptions.EnableRetryOnFailure(maxRetryCount: 10, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null);
+ });
+
+ // Changing default behavior when client evaluation occurs to throw.
+ // Default in EF Core would be to log a warning when client evaluation is performed.
+ options.ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));
+ //Check Client vs. Server evaluation: https://docs.microsoft.com/en-us/ef/core/querying/client-eval
+ });
+
+ services.AddDbContext(options =>
+ {
+ options.UseSqlServer(configuration["ConnectionString"],
+ sqlServerOptionsAction: sqlOptions =>
+ {
+ sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name);
+ //Configuring Connection Resiliency: https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency
+ sqlOptions.EnableRetryOnFailure(maxRetryCount: 10, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null);
+ });
+ });
+
+ return services;
+ }
+
+ public static IServiceCollection AddCustomOptions(this IServiceCollection services, IConfiguration configuration)
+ {
+ services.Configure(configuration);
+ services.Configure(options =>
+ {
+ options.InvalidModelStateResponseFactory = context =>
+ {
+ var problemDetails = new ValidationProblemDetails(context.ModelState)
+ {
+ Instance = context.HttpContext.Request.Path,
+ Status = StatusCodes.Status400BadRequest,
+ Detail = "Please refer to the errors property for additional details."
+ };
+
+ return new BadRequestObjectResult(problemDetails)
+ {
+ ContentTypes = { "application/problem+json", "application/problem+xml" }
+ };
+ };
+ });
+
+ return services;
+ }
+
+ public static IServiceCollection AddSwagger(this IServiceCollection services)
+ {
+ services.AddSwaggerGen(options =>
+ {
+ options.DescribeAllEnumsAsStrings();
+ options.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info
+ {
+ Title = "eShopOnContainers - Catalog HTTP API",
+ Version = "v1",
+ Description = "The Catalog Microservice HTTP API. This is a Data-Driven/CRUD microservice sample",
+ TermsOfService = "Terms Of Service"
+ });
+ });
+
+ return services;
+
+ }
+
+ public static IServiceCollection AddIntegrationServices(this IServiceCollection services, IConfiguration configuration)
+ {
+ services.AddTransient>(
+ sp => (DbConnection c) => new IntegrationEventLogService(c));
+
+ services.AddTransient();
+
+ if (configuration.GetValue("AzureServiceBusEnabled"))
+ {
+ services.AddSingleton(sp =>
+ {
+ var settings = sp.GetRequiredService>().Value;
+ var logger = sp.GetRequiredService>();
+
+ var serviceBusConnection = new ServiceBusConnectionStringBuilder(settings.EventBusConnection);
+
+ return new DefaultServiceBusPersisterConnection(serviceBusConnection, logger);
+ });
+ }
+ else
+ {
+ services.AddSingleton(sp =>
+ {
+ var settings = sp.GetRequiredService>().Value;
+ var logger = sp.GetRequiredService>();
+
+ var factory = new ConnectionFactory()
+ {
+ HostName = configuration["EventBusConnection"]
+ };
+
+ if (!string.IsNullOrEmpty(configuration["EventBusUserName"]))
+ {
+ factory.UserName = configuration["EventBusUserName"];
+ }
+
+ if (!string.IsNullOrEmpty(configuration["EventBusPassword"]))
+ {
+ factory.Password = configuration["EventBusPassword"];
+ }
+
+ var retryCount = 5;
+ if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"]))
+ {
+ retryCount = int.Parse(configuration["EventBusRetryCount"]);
+ }
+
+ return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount);
+ });
+ }
+
+ return services;
+ }
+
+ public static IServiceCollection AddEventBus(this IServiceCollection services, IConfiguration configuration)
+ {
+ var subscriptionClientName = configuration["SubscriptionClientName"];
+
+ if (configuration.GetValue("AzureServiceBusEnabled"))
+ {
+ services.AddSingleton(sp =>
+ {
+ var serviceBusPersisterConnection = sp.GetRequiredService();
+ var iLifetimeScope = sp.GetRequiredService();
+ var logger = sp.GetRequiredService>();
+ var eventBusSubcriptionsManager = sp.GetRequiredService();
+
+ return new EventBusServiceBus(serviceBusPersisterConnection, logger,
+ eventBusSubcriptionsManager, subscriptionClientName, iLifetimeScope);
+ });
+
+ }
+ else
+ {
+ services.AddSingleton(sp =>
+ {
+ var rabbitMQPersistentConnection = sp.GetRequiredService();
+ var iLifetimeScope = sp.GetRequiredService();
+ var logger = sp.GetRequiredService>();
+ var eventBusSubcriptionsManager = sp.GetRequiredService();
+
+ var retryCount = 5;
+ if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"]))
+ {
+ retryCount = int.Parse(configuration["EventBusRetryCount"]);
+ }
+
+ return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, subscriptionClientName, retryCount);
+ });
+ }
+
+ services.AddSingleton();
+ services.AddTransient();
+ services.AddTransient();
+
+ return services;
+ }
+ }
}
diff --git a/src/Services/Location/Locations.API/Dockerfile b/src/Services/Location/Locations.API/Dockerfile
index 12ac0e442..2e4d7c4a9 100644
--- a/src/Services/Location/Locations.API/Dockerfile
+++ b/src/Services/Location/Locations.API/Dockerfile
@@ -1,8 +1,8 @@
-FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
+FROM microsoft/dotnet:2.1.3-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
-FROM microsoft/dotnet:2.1-sdk AS build
+FROM microsoft/dotnet:2.1.401-sdk AS build
WORKDIR /src
COPY . .
WORKDIR /src/src/Services/Location/Locations.API
diff --git a/src/Services/Location/Locations.API/Locations.API.csproj b/src/Services/Location/Locations.API/Locations.API.csproj
index 9ca1205eb..1455f13da 100644
--- a/src/Services/Location/Locations.API/Locations.API.csproj
+++ b/src/Services/Location/Locations.API/Locations.API.csproj
@@ -1,32 +1,33 @@
-
- netcoreapp2.1
- ..\..\..\..\docker-compose.dcproj
- aspnet-Locations.API-20161122013619
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ netcoreapp2.1
+ 2.1.3
+ ..\..\..\..\docker-compose.dcproj
+ aspnet-Locations.API-20161122013619
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Services/Marketing/Marketing.API/Dockerfile b/src/Services/Marketing/Marketing.API/Dockerfile
index 75d698bfe..be3141fb2 100644
--- a/src/Services/Marketing/Marketing.API/Dockerfile
+++ b/src/Services/Marketing/Marketing.API/Dockerfile
@@ -1,8 +1,8 @@
-FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
+FROM microsoft/dotnet:2.1.3-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
-FROM microsoft/dotnet:2.1-sdk AS build
+FROM microsoft/dotnet:2.1.401-sdk AS build
WORKDIR /src
COPY . .
WORKDIR /src/src/Services/Marketing/Marketing.API
diff --git a/src/Services/Marketing/Marketing.API/Marketing.API.csproj b/src/Services/Marketing/Marketing.API/Marketing.API.csproj
index c65da0eee..2c227dfc8 100644
--- a/src/Services/Marketing/Marketing.API/Marketing.API.csproj
+++ b/src/Services/Marketing/Marketing.API/Marketing.API.csproj
@@ -1,55 +1,56 @@
-
- netcoreapp2.1
- ..\..\..\..\docker-compose.dcproj
- Microsoft.eShopOnContainers.Services.Marketing.API
- $(AssetTargetFallback);portable-net45+win8+wp8+wpa81;
- aspnet-Marketing.API-20161122013619
-
- /subscriptions/6c22bb55-0221-4ce4-9bf1-3c4a10a7294c/resourcegroups/eshop-log/providers/microsoft.insights/components/eshopappinsights
- /subscriptions/6c22bb55-0221-4ce4-9bf1-3c4a10a7294c/resourcegroups/eshop-log/providers/microsoft.insights/components/eshopappinsights
-
+
+ netcoreapp2.1
+ 2.1.3
+ ..\..\..\..\docker-compose.dcproj
+ Microsoft.eShopOnContainers.Services.Marketing.API
+ $(AssetTargetFallback);portable-net45+win8+wp8+wpa81;
+ aspnet-Marketing.API-20161122013619
+
+ /subscriptions/6c22bb55-0221-4ce4-9bf1-3c4a10a7294c/resourcegroups/eshop-log/providers/microsoft.insights/components/eshopappinsights
+ /subscriptions/6c22bb55-0221-4ce4-9bf1-3c4a10a7294c/resourcegroups/eshop-log/providers/microsoft.insights/components/eshopappinsights
+
-
-
-
-
- PreserveNewest
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ PreserveNewest
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
- PreserveNewest
-
-
+
+
+ PreserveNewest
+
+
-
-
-
+
+
+
diff --git a/src/Services/Marketing/Marketing.API/Properties/launchSettings.json b/src/Services/Marketing/Marketing.API/Properties/launchSettings.json
index dea046099..5e781ebb6 100644
--- a/src/Services/Marketing/Marketing.API/Properties/launchSettings.json
+++ b/src/Services/Marketing/Marketing.API/Properties/launchSettings.json
@@ -14,7 +14,8 @@
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
- }
+ },
+ "use64Bit": true
},
"Marketing.API": {
"commandName": "Project",
diff --git a/src/Services/Ordering/Ordering.API/Dockerfile b/src/Services/Ordering/Ordering.API/Dockerfile
index 78c153641..af1adb170 100644
--- a/src/Services/Ordering/Ordering.API/Dockerfile
+++ b/src/Services/Ordering/Ordering.API/Dockerfile
@@ -1,8 +1,8 @@
-FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
+FROM microsoft/dotnet:2.1.3-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
-FROM microsoft/dotnet:2.1-sdk AS build
+FROM microsoft/dotnet:2.1.401-sdk AS build
WORKDIR /src
COPY . .
WORKDIR /src/src/Services/Ordering/Ordering.API
diff --git a/src/Services/Ordering/Ordering.API/Ordering.API.csproj b/src/Services/Ordering/Ordering.API/Ordering.API.csproj
index 11b2d13f9..59092f3e1 100644
--- a/src/Services/Ordering/Ordering.API/Ordering.API.csproj
+++ b/src/Services/Ordering/Ordering.API/Ordering.API.csproj
@@ -1,56 +1,57 @@
-
- netcoreapp2.1
- aspnet-Ordering.API-20161122013547
- $(AssetTargetFallback);portable-net45+win8+wp8+wpa81;
- ..\..\..\..\docker-compose.dcproj
-
+
+ netcoreapp2.1
+ 2.1.3
+ aspnet-Ordering.API-20161122013547
+ $(AssetTargetFallback);portable-net45+win8+wp8+wpa81;
+ ..\..\..\..\docker-compose.dcproj
+
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PreserveNewest
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
diff --git a/src/Services/Ordering/Ordering.API/Properties/launchSettings.json b/src/Services/Ordering/Ordering.API/Properties/launchSettings.json
index 9d9a76490..1d2575af4 100644
--- a/src/Services/Ordering/Ordering.API/Properties/launchSettings.json
+++ b/src/Services/Ordering/Ordering.API/Properties/launchSettings.json
@@ -14,7 +14,8 @@
"launchUrl": "/swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
- }
+ },
+ "use64Bit": true
},
"Microsoft.eShopOnContainers.Services.Ordering.API": {
"commandName": "Project",
diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile b/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile
index 0c01dcb96..d8ed0edb3 100644
--- a/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile
+++ b/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile
@@ -1,8 +1,8 @@
-FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
+FROM microsoft/dotnet:2.1.3-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
-FROM microsoft/dotnet:2.1-sdk AS build
+FROM microsoft/dotnet:2.1.401-sdk AS build
WORKDIR /src
COPY . .
WORKDIR /src/src/Services/Ordering/Ordering.BackgroundTasks
diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj b/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj
index 5ca8b4b3b..c5d9df46e 100644
--- a/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj
+++ b/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj
@@ -1,31 +1,32 @@
-
- netcoreapp2.1
- $(AssetTargetFallback);portable-net45+win8+wp8+wpa81;
- ..\..\..\..\docker-compose.dcproj
-
+
+ netcoreapp2.1
+ 2.1.3
+ $(AssetTargetFallback);portable-net45+win8+wp8+wpa81;
+ ..\..\..\..\docker-compose.dcproj
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/Properties/launchSettings.json b/src/Services/Ordering/Ordering.BackgroundTasks/Properties/launchSettings.json
index 6d60a7d28..f7e0be3d0 100644
--- a/src/Services/Ordering/Ordering.BackgroundTasks/Properties/launchSettings.json
+++ b/src/Services/Ordering/Ordering.BackgroundTasks/Properties/launchSettings.json
@@ -14,7 +14,8 @@
"launchUrl": "api/values",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
- }
+ },
+ "use64Bit": true
},
"Ordering.BackgroundTasks": {
"commandName": "Project",
@@ -26,4 +27,4 @@
"applicationUrl": "http://localhost:5162/"
}
}
-}
+}
\ No newline at end of file
diff --git a/src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj b/src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj
index 72cd00442..1ad442f19 100644
--- a/src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj
+++ b/src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj
@@ -9,9 +9,9 @@
-
-
-
+
+
+
diff --git a/src/Services/Ordering/Ordering.SignalrHub/Dockerfile b/src/Services/Ordering/Ordering.SignalrHub/Dockerfile
index 367b8db36..4d6083d5f 100644
--- a/src/Services/Ordering/Ordering.SignalrHub/Dockerfile
+++ b/src/Services/Ordering/Ordering.SignalrHub/Dockerfile
@@ -1,8 +1,8 @@
-FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
+FROM microsoft/dotnet:2.1.3-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
-FROM microsoft/dotnet:2.1-sdk AS build
+FROM microsoft/dotnet:2.1.401-sdk AS build
WORKDIR /src
COPY . .
WORKDIR /src/src/Services/Ordering/Ordering.SignalrHub
diff --git a/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj b/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj
index fad53bbcf..fff55f6f3 100644
--- a/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj
+++ b/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj
@@ -1,31 +1,32 @@
-
- netcoreapp2.1
- ..\..\..\..\docker-compose.dcproj
-
+
+ netcoreapp2.1
+ 2.1.3
+ ..\..\..\..\docker-compose.dcproj
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
diff --git a/src/Services/Ordering/Ordering.SignalrHub/Properties/launchSettings.json b/src/Services/Ordering/Ordering.SignalrHub/Properties/launchSettings.json
index 3ff683a08..1e77b0843 100644
--- a/src/Services/Ordering/Ordering.SignalrHub/Properties/launchSettings.json
+++ b/src/Services/Ordering/Ordering.SignalrHub/Properties/launchSettings.json
@@ -13,7 +13,8 @@
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
- }
+ },
+ "use64Bit": true
},
"Ordering.SignalrHub": {
"commandName": "Project",
@@ -24,4 +25,4 @@
"applicationUrl": "http://localhost:51312/"
}
}
-}
+}
\ No newline at end of file
diff --git a/src/Services/Payment/Payment.API/Dockerfile b/src/Services/Payment/Payment.API/Dockerfile
index d644417c6..8bea8a1ef 100644
--- a/src/Services/Payment/Payment.API/Dockerfile
+++ b/src/Services/Payment/Payment.API/Dockerfile
@@ -1,8 +1,8 @@
-FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
+FROM microsoft/dotnet:2.1.3-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
-FROM microsoft/dotnet:2.1-sdk AS build
+FROM microsoft/dotnet:2.1.401-sdk AS build
WORKDIR /src
COPY . .
WORKDIR /src/src/Services/Payment/Payment.API
diff --git a/src/Services/Payment/Payment.API/Payment.API.csproj b/src/Services/Payment/Payment.API/Payment.API.csproj
index 061e5f237..10ea0ff9d 100644
--- a/src/Services/Payment/Payment.API/Payment.API.csproj
+++ b/src/Services/Payment/Payment.API/Payment.API.csproj
@@ -1,28 +1,29 @@
-
- netcoreapp2.1
- ..\..\..\..\docker-compose.dcproj
- $(AssetTargetFallback);portable-net45+win8+wp8+wpa81;
-
+
+ netcoreapp2.1
+ 2.1.3
+ ..\..\..\..\docker-compose.dcproj
+ $(AssetTargetFallback);portable-net45+win8+wp8+wpa81;
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Services/Payment/Payment.API/Properties/launchSettings.json b/src/Services/Payment/Payment.API/Properties/launchSettings.json
index 5eac4c092..067fa394b 100644
--- a/src/Services/Payment/Payment.API/Properties/launchSettings.json
+++ b/src/Services/Payment/Payment.API/Properties/launchSettings.json
@@ -14,7 +14,8 @@
"launchUrl": "api/values",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
- }
+ },
+ "use64Bit": true
},
"Payment.API": {
"commandName": "Project",
diff --git a/src/Web/WebStatus/Dockerfile b/src/Web/WebStatus/Dockerfile
index 10cfa25e5..c597337f6 100644
--- a/src/Web/WebStatus/Dockerfile
+++ b/src/Web/WebStatus/Dockerfile
@@ -1,12 +1,13 @@
-FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
+FROM microsoft/dotnet:2.1.3-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
-FROM microsoft/dotnet:2.1-sdk AS build
+FROM microsoft/dotnet:2.1.401-sdk AS build
WORKDIR /src
COPY . .
WORKDIR /src/src/Web/WebStatus
RUN dotnet restore -nowarn:msb3202,nu1503
+COPY src/Web/WebMVC/synergydev.pfx /root/.aspnet/https/
RUN dotnet build --no-restore -c Release -o /app
FROM build AS publish
diff --git a/src/Web/WebStatus/Properties/launchSettings.json b/src/Web/WebStatus/Properties/launchSettings.json
index 554e3f093..8adad741c 100644
--- a/src/Web/WebStatus/Properties/launchSettings.json
+++ b/src/Web/WebStatus/Properties/launchSettings.json
@@ -13,7 +13,8 @@
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
- }
+ },
+ "use64Bit": true
},
"WebStatus": {
"commandName": "Project",
diff --git a/src/Web/WebStatus/Startup.cs b/src/Web/WebStatus/Startup.cs
index 6a9ed32d1..128731284 100644
--- a/src/Web/WebStatus/Startup.cs
+++ b/src/Web/WebStatus/Startup.cs
@@ -1,110 +1,111 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
+using Microsoft.ApplicationInsights.Extensibility;
+using Microsoft.ApplicationInsights.ServiceFabric;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using WebStatus.Extensions;
-using Microsoft.ApplicationInsights.Extensibility;
-using Microsoft.ApplicationInsights.ServiceFabric;
+
+using TimeSpan = System.TimeSpan;
namespace WebStatus
{
- public class Startup
- {
- public Startup(IConfiguration configuration)
- {
- Configuration = configuration;
- }
-
- public IConfiguration Configuration { get; }
-
- // This method gets called by the runtime. Use this method to add services to the container.
- public void ConfigureServices(IServiceCollection services)
- {
- RegisterAppInsights(services);
-
- services.AddOptions();
-
- // Add framework services.
- services.AddHealthChecks(checks =>
- {
- var minutes = 1;
- if (int.TryParse(Configuration["HealthCheck:Timeout"], out var minutesParsed))
- {
- minutes = minutesParsed;
- }
-
- checks.AddUrlCheckIfNotNull(Configuration["OrderingUrl"], TimeSpan.FromMinutes(minutes));
- checks.AddUrlCheckIfNotNull(Configuration["OrderingBackgroundTasksUrl"], TimeSpan.FromMinutes(minutes));
- checks.AddUrlCheckIfNotNull(Configuration["BasketUrl"], TimeSpan.Zero); //No cache for this HealthCheck, better just for demos
- checks.AddUrlCheckIfNotNull(Configuration["CatalogUrl"], TimeSpan.FromMinutes(minutes));
- checks.AddUrlCheckIfNotNull(Configuration["IdentityUrl"], TimeSpan.FromMinutes(minutes));
- checks.AddUrlCheckIfNotNull(Configuration["LocationsUrl"], TimeSpan.FromMinutes(minutes));
- checks.AddUrlCheckIfNotNull(Configuration["MarketingUrl"], TimeSpan.FromMinutes(minutes));
- checks.AddUrlCheckIfNotNull(Configuration["PaymentUrl"], TimeSpan.FromMinutes(minutes));
- checks.AddUrlCheckIfNotNull(Configuration["mvc"], TimeSpan.Zero); //No cache for this HealthCheck, better just for demos
- checks.AddUrlCheckIfNotNull(Configuration["spa"], TimeSpan.Zero); //No cache for this HealthCheck, better just for demos
- });
-
- services.AddMvc();
- }
-
- // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
- public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
- {
- loggerFactory.AddAzureWebAppDiagnostics();
- loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace);
-
- if (env.IsDevelopment())
- {
- app.UseDeveloperExceptionPage();
- }
- else
- {
- app.UseExceptionHandler("/Home/Error");
- }
-
- var pathBase = Configuration["PATH_BASE"];
- if (!string.IsNullOrEmpty(pathBase))
- {
- app.UsePathBase(pathBase);
- }
+ public class Startup
+ {
+ public Startup(IConfiguration configuration)
+ {
+ Configuration = configuration;
+ }
+
+ public IConfiguration Configuration { get; }
+
+ // This method gets called by the runtime. Use this method to add services to the container.
+ public void ConfigureServices(IServiceCollection services)
+ {
+ RegisterAppInsights(services);
+
+ services.AddOptions();
+
+ // Add framework services.
+ services.AddHealthChecks(checks =>
+ {
+ var minutes = 1;
+ if (int.TryParse(Configuration["HealthCheck:Timeout"], out int minutesParsed))
+ {
+ minutes = minutesParsed;
+ }
+
+ checks.AddUrlCheckIfNotNull(Configuration["OrderingUrl"], TimeSpan.FromMinutes(minutes));
+ checks.AddUrlCheckIfNotNull(Configuration["OrderingBackgroundTasksUrl"], TimeSpan.FromMinutes(minutes));
+ checks.AddUrlCheckIfNotNull(Configuration["BasketUrl"], TimeSpan.Zero); //No cache for this HealthCheck, better just for demos
+ checks.AddUrlCheckIfNotNull(Configuration["CatalogUrl"], TimeSpan.FromMinutes(minutes));
+ checks.AddUrlCheckIfNotNull(Configuration["IdentityUrl"], TimeSpan.FromMinutes(minutes));
+ checks.AddUrlCheckIfNotNull(Configuration["LocationsUrl"], TimeSpan.FromMinutes(minutes));
+ checks.AddUrlCheckIfNotNull(Configuration["MarketingUrl"], TimeSpan.FromMinutes(minutes));
+ checks.AddUrlCheckIfNotNull(Configuration["PaymentUrl"], TimeSpan.FromMinutes(minutes));
+ checks.AddUrlCheckIfNotNull(Configuration["mvc"], TimeSpan.Zero); //No cache for this HealthCheck, better just for demos
+ checks.AddUrlCheckIfNotNull(Configuration["spa"], TimeSpan.Zero); //No cache for this HealthCheck, better just for demos
+ });
+
+ services
+ .AddMvc()
+ .SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_2_1)
+ ;
+ }
+
+ // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
+ {
+ loggerFactory.AddAzureWebAppDiagnostics();
+ loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace);
+
+ if (env.IsDevelopment())
+ {
+ app.UseDeveloperExceptionPage();
+ }
+ else
+ {
+ app.UseExceptionHandler("/Home/Error");
+ }
+
+ var pathBase = Configuration["PATH_BASE"];
+ if (!string.IsNullOrEmpty(pathBase))
+ {
+ app.UsePathBase(pathBase);
+ }
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
- app.Map("/liveness", lapp => lapp.Run(async ctx => ctx.Response.StatusCode = 200));
+ app.Map("/liveness", lapp => lapp.Run(async ctx => ctx.Response.StatusCode = 200));
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
- app.UseStaticFiles();
-
- app.UseMvc(routes =>
- {
- routes.MapRoute(
- name: "default",
- template: "{controller=Home}/{action=Index}/{id?}");
- });
- }
-
- private void RegisterAppInsights(IServiceCollection services)
- {
- services.AddApplicationInsightsTelemetry(Configuration);
- var orchestratorType = Configuration.GetValue("OrchestratorType");
-
- if (orchestratorType?.ToUpper() == "K8S")
- {
- // Enable K8s telemetry initializer
- services.EnableKubernetes();
- }
- if (orchestratorType?.ToUpper() == "SF")
- {
- // Enable SF telemetry initializer
- services.AddSingleton((serviceProvider) =>
- new FabricTelemetryInitializer());
- }
- }
- }
+ app.UseStaticFiles();
+
+ app.UseMvc(routes =>
+ {
+ routes.MapRoute(
+ name: "default",
+ template: "{controller=Home}/{action=Index}/{id?}");
+ });
+ }
+
+ private void RegisterAppInsights(IServiceCollection services)
+ {
+ services.AddApplicationInsightsTelemetry(Configuration);
+ var orchestratorType = Configuration.GetValue("OrchestratorType");
+
+ if (orchestratorType?.ToUpper() == "K8S")
+ {
+ // Enable K8s telemetry initializer
+ services.EnableKubernetes();
+ }
+ if (orchestratorType?.ToUpper() == "SF")
+ {
+ // Enable SF telemetry initializer
+ services.AddSingleton((serviceProvider) =>
+ new FabricTelemetryInitializer());
+ }
+ }
+ }
}
diff --git a/src/Web/WebStatus/WebStatus.csproj b/src/Web/WebStatus/WebStatus.csproj
index 125058166..df23024a5 100644
--- a/src/Web/WebStatus/WebStatus.csproj
+++ b/src/Web/WebStatus/WebStatus.csproj
@@ -1,22 +1,23 @@
-
- netcoreapp2.1
- $(AssetTargetFallback);portable-net45+win8+wp8+wpa81;
- ..\..\..\docker-compose.dcproj
-
-
-
-
-
-
-
-
-
-
+
+ netcoreapp2.1
+ 2.1.3
+ $(AssetTargetFallback);portable-net45+win8+wp8+wpa81;
+ ..\..\..\docker-compose.dcproj
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+