diff --git a/.gitignore b/.gitignore index 1423511fe8..a6233dafb9 100644 --- a/.gitignore +++ b/.gitignore @@ -290,3 +290,4 @@ samples/MicroserviceDemo/microservices/IdentityService.Host/Logs/logs.txt samples/MicroserviceDemo/applications/BackendAdminApp.Host/Logs/logs.txt samples/MicroserviceDemo/microservices/ProductService.Host/Logs/logs.txt samples/MicroserviceDemo/gateways/InternalGateway.Host/Logs/logs.txt +samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/Logs/logs.txt diff --git a/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BackendAdminAppHostModule.cs b/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BackendAdminAppHostModule.cs index bb6d884e57..51b1787bee 100644 --- a/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BackendAdminAppHostModule.cs +++ b/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BackendAdminAppHostModule.cs @@ -58,7 +58,7 @@ namespace BackendAdminApp.Host options.Scope.Add("role"); options.Scope.Add("email"); options.Scope.Add("phone"); - options.Scope.Add("InternalGateway"); + options.Scope.Add("BackendAdminAppGateway"); options.Scope.Add("IdentityService"); options.Scope.Add("ProductService"); diff --git a/samples/MicroserviceDemo/applications/BackendAdminApp.Host/appsettings.json b/samples/MicroserviceDemo/applications/BackendAdminApp.Host/appsettings.json index 35afa3c1e8..3547c1d0cd 100644 --- a/samples/MicroserviceDemo/applications/BackendAdminApp.Host/appsettings.json +++ b/samples/MicroserviceDemo/applications/BackendAdminApp.Host/appsettings.json @@ -1,7 +1,7 @@ { "RemoteServices": { "Default": { - "BaseUrl": "http://localhost:65129/" + "BaseUrl": "http://localhost:65115/" } }, "Logging": { diff --git a/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs b/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs index b7d6203609..4066e21156 100644 --- a/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs +++ b/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs @@ -51,7 +51,7 @@ namespace ConsoleClientDemo { await _authenticator.AuthenticateAsync(client); - var response = await client.GetAsync(_remoteServiceOptions.RemoteServices.Default.BaseUrl.EnsureEndsWith('/') + "Test"); + var response = await client.GetAsync(_remoteServiceOptions.RemoteServices.Default.BaseUrl.EnsureEndsWith('/') + "Test/Index"); if (!response.IsSuccessStatusCode) { Console.WriteLine(response.StatusCode); diff --git a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGateway.Host.csproj b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGateway.Host.csproj index 423afacffc..82d878178d 100644 --- a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGateway.Host.csproj +++ b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGateway.Host.csproj @@ -1,13 +1,45 @@ - + netcoreapp2.2 - InProcess + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + true + true + true + true + false + true - - + + + + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + diff --git a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGatewayHostModule.cs b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGatewayHostModule.cs new file mode 100644 index 0000000000..761ff5dba5 --- /dev/null +++ b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGatewayHostModule.cs @@ -0,0 +1,87 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Ocelot.DependencyInjection; +using Ocelot.Middleware; +using ProductManagement; +using Swashbuckle.AspNetCore.Swagger; +using Volo.Abp; +using Volo.Abp.Autofac; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.SqlServer; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.Security.Claims; +using Volo.Abp.SettingManagement.EntityFrameworkCore; + +namespace BackendAdminAppGateway.Host +{ + [DependsOn( + typeof(AbpAutofacModule), + typeof(AbpIdentityHttpApiModule), + typeof(ProductManagementHttpApiModule), + typeof(AbpEntityFrameworkCoreSqlServerModule), + typeof(AbpPermissionManagementEntityFrameworkCoreModule), + typeof(AbpSettingManagementEntityFrameworkCoreModule) + )] + public class BackendAdminAppGatewayHostModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + //TODO: Internal gateway may not need to authentication in the gateway level, we may remove this when we complete and use the other gateways + + context.Services.AddAuthentication("Bearer") + .AddIdentityServerAuthentication(options => + { + options.Authority = "http://localhost:64999"; + options.RequireHttpsMetadata = false; + options.ApiName = "BackendAdminAppGateway"; + + //TODO: Should create an extension method for that (may require to create a new ABP package depending on the IdentityServer4.AccessTokenValidation) + options.InboundJwtClaimTypeMap["sub"] = AbpClaimTypes.UserId; + options.InboundJwtClaimTypeMap["role"] = AbpClaimTypes.Role; + options.InboundJwtClaimTypeMap["email"] = AbpClaimTypes.Email; + options.InboundJwtClaimTypeMap["email_verified"] = AbpClaimTypes.EmailVerified; + options.InboundJwtClaimTypeMap["phone_number"] = AbpClaimTypes.PhoneNumber; + options.InboundJwtClaimTypeMap["phone_number_verified"] = AbpClaimTypes.PhoneNumberVerified; + options.InboundJwtClaimTypeMap["name"] = AbpClaimTypes.UserName; + }); + + context.Services.AddSwaggerGen(options => + { + options.SwaggerDoc("v1", new Info { Title = "BackendAdminApp Gateway API", Version = "v1" }); + options.DocInclusionPredicate((docName, description) => true); + options.CustomSchemaIds(type => type.FullName); + }); + + context.Services.AddOcelot(context.Services.GetConfiguration()); + + Configure(options => + { + options.UseSqlServer(); + }); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + + app.UseVirtualFiles(); + app.UseAuthentication(); + app.UseSwagger(); + app.UseSwaggerUI(options => + { + options.SwaggerEndpoint("/swagger/v1/swagger.json", "BackendAdminApp Gateway API"); + }); + + app.MapWhen(ctx => ctx.Request.Path.ToString().StartsWith("/api/abp/") || + ctx.Request.Path.ToString().StartsWith("/Abp/"), + app2 => + { + app2.UseMvcWithDefaultRouteAndArea(); + }); + + app.UseOcelot().Wait(); + } + } +} diff --git a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/Program.cs b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/Program.cs index 453e54f19e..6e2a864021 100644 --- a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/Program.cs +++ b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/Program.cs @@ -1,24 +1,46 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; +using Serilog; +using Serilog.Events; namespace BackendAdminAppGateway.Host { public class Program { - public static void Main(string[] args) + public static int Main(string[] args) { - CreateWebHostBuilder(args).Build().Run(); + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Debug() + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .Enrich.FromLogContext() + .WriteTo.File("Logs/logs.txt") + .CreateLogger(); + + try + { + Log.Information("Starting BackendAdminAppGateway.Host."); + BuildWebHostInternal(args).Run(); + return 0; + } + catch (Exception ex) + { + Log.Fatal(ex, "BackendAdminAppGateway.Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } } - public static IWebHostBuilder CreateWebHostBuilder(string[] args) => - WebHost.CreateDefaultBuilder(args) - .UseStartup(); + public static IWebHost BuildWebHostInternal(string[] args) => + new WebHostBuilder() + .UseKestrel() + .UseContentRoot(Directory.GetCurrentDirectory()) + .UseIISIntegration() + .UseStartup() + .UseSerilog() + .Build(); } } diff --git a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/Startup.cs b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/Startup.cs index fa24a0a687..4b41be9ad3 100644 --- a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/Startup.cs +++ b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/Startup.cs @@ -1,34 +1,28 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Volo.Abp; namespace BackendAdminAppGateway.Host { public class Startup { - // This method gets called by the runtime. Use this method to add services to the container. - // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 - public void ConfigureServices(IServiceCollection services) + public IServiceProvider ConfigureServices(IServiceCollection services) { + services.AddApplication(options => + { + options.UseAutofac(); + options.Configuration.UserSecretsAssembly = typeof(Startup).Assembly; + }); + + return services.BuildServiceProviderFromFactory(); } - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IHostingEnvironment env) + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.Run(async (context) => - { - await context.Response.WriteAsync("Hello World!"); - }); + app.InitializeApplication(); } } } diff --git a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/appsettings.json b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/appsettings.json index def9159a7d..3576c4e205 100644 --- a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/appsettings.json +++ b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/appsettings.json @@ -1,4 +1,36 @@ { + "ConnectionStrings": { + "Default": "Server=localhost;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true" + }, + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/identity/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "localhost", + "Port": 63568 + } + ], + "UpstreamPathTemplate": "/api/identity/{everything}", + "UpstreamHttpMethod": [ "Put", "Delete", "Get", "Post" ] + }, + { + "DownstreamPathTemplate": "/api/productManagement/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "localhost", + "Port": 60244 + } + ], + "UpstreamPathTemplate": "/api/productManagement/{everything}", + "UpstreamHttpMethod": [ "Put", "Delete", "Get", "Post" ] + } + ], + "GlobalConfiguration": { + "BaseUrl": "http://localhost:65115" + }, "Logging": { "LogLevel": { "Default": "Warning" diff --git a/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGatewayHostModule.cs b/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGatewayHostModule.cs index b0bb455aa8..d8c0d031b9 100644 --- a/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGatewayHostModule.cs +++ b/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGatewayHostModule.cs @@ -74,8 +74,14 @@ namespace InternalGateway.Host options.SwaggerEndpoint("/swagger/v1/swagger.json", "Internal Gateway API"); }); - app.MapWhen(ctx => ctx.Request.Path.ToString().StartsWith("/api/abp/") || ctx.Request.Path.ToString().StartsWith("/Abp/"), - app2 => { app2.UseMvcWithDefaultRouteAndArea(); }); + app.MapWhen(ctx => + ctx.Request.Path.ToString().StartsWith("/api/abp/") || + ctx.Request.Path.ToString().StartsWith("/Abp/") || + ctx.Request.Path.ToString().StartsWith("/Test/"), + app2 => + { + app2.UseMvcWithDefaultRouteAndArea(); + }); app.UseOcelot().Wait(); } diff --git a/samples/MicroserviceDemo/microservices/IdentityService.Host/TestController.cs b/samples/MicroserviceDemo/gateways/InternalGateway.Host/TestController.cs similarity index 96% rename from samples/MicroserviceDemo/microservices/IdentityService.Host/TestController.cs rename to samples/MicroserviceDemo/gateways/InternalGateway.Host/TestController.cs index fd1a2b9755..ca02a4a9d4 100644 --- a/samples/MicroserviceDemo/microservices/IdentityService.Host/TestController.cs +++ b/samples/MicroserviceDemo/gateways/InternalGateway.Host/TestController.cs @@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.Json; -namespace IdentityService.Host +namespace InternalGateway.Host { public class TestController : AbpController { diff --git a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/BackendAdminAppGatewayHostModule.cs b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/BackendAdminAppGatewayHostModule.cs new file mode 100644 index 0000000000..c950c894b0 --- /dev/null +++ b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/BackendAdminAppGatewayHostModule.cs @@ -0,0 +1,83 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Ocelot.DependencyInjection; +using Ocelot.Middleware; +using ProductManagement; +using Swashbuckle.AspNetCore.Swagger; +using Volo.Abp; +using Volo.Abp.Autofac; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.SqlServer; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.Security.Claims; +using Volo.Abp.SettingManagement.EntityFrameworkCore; + +namespace PublicWebSiteGateway.Host +{ + [DependsOn( + typeof(AbpAutofacModule), + typeof(AbpIdentityHttpApiModule), + typeof(ProductManagementHttpApiModule), + typeof(AbpEntityFrameworkCoreSqlServerModule), + typeof(AbpPermissionManagementEntityFrameworkCoreModule), + typeof(AbpSettingManagementEntityFrameworkCoreModule) + )] + public class PublicWebSiteGatewayHostModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + //TODO: Internal gateway may not need to authentication in the gateway level, we may remove this when we complete and use the other gateways + + context.Services.AddAuthentication("Bearer") + .AddIdentityServerAuthentication(options => + { + options.Authority = "http://localhost:64999"; + options.RequireHttpsMetadata = false; + options.ApiName = "PublicWebSiteGateway"; + + //TODO: Should create an extension method for that (may require to create a new ABP package depending on the IdentityServer4.AccessTokenValidation) + options.InboundJwtClaimTypeMap["sub"] = AbpClaimTypes.UserId; + options.InboundJwtClaimTypeMap["role"] = AbpClaimTypes.Role; + options.InboundJwtClaimTypeMap["email"] = AbpClaimTypes.Email; + options.InboundJwtClaimTypeMap["email_verified"] = AbpClaimTypes.EmailVerified; + options.InboundJwtClaimTypeMap["phone_number"] = AbpClaimTypes.PhoneNumber; + options.InboundJwtClaimTypeMap["phone_number_verified"] = AbpClaimTypes.PhoneNumberVerified; + options.InboundJwtClaimTypeMap["name"] = AbpClaimTypes.UserName; + }); + + context.Services.AddSwaggerGen(options => + { + options.SwaggerDoc("v1", new Info { Title = "PublicWebSite Gateway API", Version = "v1" }); + options.DocInclusionPredicate((docName, description) => true); + options.CustomSchemaIds(type => type.FullName); + }); + + context.Services.AddOcelot(context.Services.GetConfiguration()); + + Configure(options => + { + options.UseSqlServer(); + }); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + + app.UseVirtualFiles(); + app.UseAuthentication(); + app.UseSwagger(); + app.UseSwaggerUI(options => + { + options.SwaggerEndpoint("/swagger/v1/swagger.json", "PublicWebSite Gateway API"); + }); + + app.MapWhen(ctx => ctx.Request.Path.ToString().StartsWith("/api/abp/") || ctx.Request.Path.ToString().StartsWith("/Abp/"), + app2 => { app2.UseMvcWithDefaultRouteAndArea(); }); + + app.UseOcelot().Wait(); + } + } +} diff --git a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/Program.cs b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/Program.cs index 2ea896608c..9a3a9e5e20 100644 --- a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/Program.cs +++ b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/Program.cs @@ -1,24 +1,46 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; +using Serilog; +using Serilog.Events; namespace PublicWebSiteGateway.Host { public class Program { - public static void Main(string[] args) + public static int Main(string[] args) { - CreateWebHostBuilder(args).Build().Run(); + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Debug() + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .Enrich.FromLogContext() + .WriteTo.File("Logs/logs.txt") + .CreateLogger(); + + try + { + Log.Information("Starting IdentityService.Host."); + BuildWebHostInternal(args).Run(); + return 0; + } + catch (Exception ex) + { + Log.Fatal(ex, "IdentityService.Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } } - public static IWebHostBuilder CreateWebHostBuilder(string[] args) => - WebHost.CreateDefaultBuilder(args) - .UseStartup(); + public static IWebHost BuildWebHostInternal(string[] args) => + new WebHostBuilder() + .UseKestrel() + .UseContentRoot(Directory.GetCurrentDirectory()) + .UseIISIntegration() + .UseStartup() + .UseSerilog() + .Build(); } } diff --git a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGateway.Host.csproj b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGateway.Host.csproj index 423afacffc..081d90cb17 100644 --- a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGateway.Host.csproj +++ b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGateway.Host.csproj @@ -1,13 +1,45 @@ - + netcoreapp2.2 - InProcess + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + true + true + true + true + false + true - - + + + + + + - + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + \ No newline at end of file diff --git a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/Startup.cs b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/Startup.cs index 9baf439827..ab6a066e3e 100644 --- a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/Startup.cs +++ b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/Startup.cs @@ -1,34 +1,28 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Volo.Abp; namespace PublicWebSiteGateway.Host { public class Startup { - // This method gets called by the runtime. Use this method to add services to the container. - // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 - public void ConfigureServices(IServiceCollection services) + public IServiceProvider ConfigureServices(IServiceCollection services) { + services.AddApplication(options => + { + options.UseAutofac(); + options.Configuration.UserSecretsAssembly = typeof(Startup).Assembly; + }); + + return services.BuildServiceProviderFromFactory(); } - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IHostingEnvironment env) + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.Run(async (context) => - { - await context.Response.WriteAsync("Hello World!"); - }); + app.InitializeApplication(); } } } diff --git a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/appsettings.json b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/appsettings.json index def9159a7d..8ccd91c095 100644 --- a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/appsettings.json +++ b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/appsettings.json @@ -1,4 +1,24 @@ { + "ConnectionStrings": { + "Default": "Server=localhost;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true" + }, + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/productManagement/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "localhost", + "Port": 60244 + } + ], + "UpstreamPathTemplate": "/api/productManagement/{everything}", + "UpstreamHttpMethod": [ "Put", "Delete", "Get", "Post" ] + } + ], + "GlobalConfiguration": { + "BaseUrl": "http://localhost:64897" + }, "Logging": { "LogLevel": { "Default": "Warning"