using System; using System.Collections.Generic; using System.IO; using System.Net.Http; using System.Reflection; using IdentityModel.AspNetCore.OAuth2Introspection; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Server.Kestrel.Core; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using xApi.Extensions; using xCommons.Configurations; using xCommons.Extensions; using xDataService.Models; using xHttpService.DI; using xIdentityService.DI; using xServices.Databases; using xServices.DI; namespace xApi { public class Startup { // public IConfiguration Configuration { get; } private readonly XApiDatabaseDescriptor apiDatabaseDescriptor; public Startup(IConfiguration configuration) { // Configuration = configuration; // // Create an Api Descriptor Class Instance ... apiDatabaseDescriptor = new XApiDatabaseDescriptor(); } public void ConfigureServices(IServiceCollection services) { // // Register Validation Provider and all XCommons Module Services ... services.AddXCommons(); // // Register App Configuration ... services.AddXAppConfiguration(Configuration); var appConfiguration = services.GetRegisteredService(); // // Register Allowed Origins ... services.AddXCors(appConfiguration.AllowedOrigins); // // Register Swagger ... var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); services.AddXSwagger(Configuration, xmlFilePath: xmlPath); // // Register HttpService ... services.AddXHttpService(Configuration); // // Add Api V1 Versioning ... services.AddXApiV1Versioning(); // // OAuthIntrospectin Http Client Handler ... // this is for handling SSLErrors ... services.AddHttpClient(OAuth2IntrospectionDefaults.BackChannelHttpClientName) .ConfigurePrimaryHttpMessageHandler(() => { return new HttpClientHandler { ServerCertificateCustomValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true }; }); // // Register Authorizations ... services.AddXAuthorization(); // services.AddControllers() .AddNewtonsoftJson(x => { x.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; x.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); }); // // Custom ... // services.Configure(options => { options.AllowSynchronousIO = true; }); // services.Configure(options => { options.AllowSynchronousIO = true; }); // // Register Services ... services.AddXServices( configuration: Configuration, databases: new List { apiDatabaseDescriptor }, lifeTime: ServiceLifetime.Scoped ); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } // // Use Swagger Middleware ... app.UseXSwagger(); // app.UseHttpsRedirection(); // // Using Cors ... app.UseXCors(); // app.UseRouting(); // // Use xIdentityService ... app.UseXIdentityService(); // app.UseAuthorization(); // app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); // // Use xDataService Middleware ... app.UseXServices( databases: new List { apiDatabaseDescriptor }, isDevelopmentEnvironment: env.IsDevelopment() ); } } }