using System.IdentityModel.Tokens.Jwt; using System.Reflection; using CallCenter.Api.Exceptions; using CallCenter.Api.Filters; using CallCenter.Api.Realtimes; using CallCenter.Devices; using CallCenter.NewRock; using CallCenter.Repository.SqlSugar; using Mapster; using MapsterMapper; using MediatR; using Microsoft.OpenApi.Models; using XF.Domain.Dependency; using CallCenter.Application; using CallCenter.Application.Contracts; using CallCenter.CacheManager; using FluentValidation; using FluentValidation.AspNetCore; using CallCenter.Settings; using Identity.Admin.HttpClient; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using Serilog; namespace CallCenter.Api; internal static class StartupExtensions { const string CorsOrigins = "CorsOrigins"; internal static WebApplication ConfigureServices(this WebApplicationBuilder builder) { var services = builder.Services; var configuration = builder.Configuration; services.AddHttpContextAccessor(); #if DEBUG builder.WebHost.UseUrls("http://192.168.100.62:50001", "http://localhost:50001"); #endif services.Configure(d => configuration.GetSection("DeviceConfigs").Bind(d)); services.Configure(d => configuration.GetSection("WorkTimeSettings").Bind(d)); // Add services to the container. services .BatchInjectServices() .AddApplication() ; services.AddIdentityClient( new IdentityClientConfiguration("http://identity.fengwo.com", "http://open.identity.fengwo.com"), d => { d.ClientId = "hotline_server"; d.ClientSecret = "ce2fae0e-f0f6-46d6-bd79-1f1a31dff494"; d.ClientScope = "identity.admin_api"; }); JwtSecurityTokenHandler.DefaultMapInboundClaims = false; services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, d => { d.Authority = "http://identity.fengwo.com"; //todo d.RequireHttpsMetadata = false; d.TokenValidationParameters = new TokenValidationParameters { ValidateAudience = false }; }) ; services.AddControllers(options => { //options.Filters.Add(); options.Filters.Add(); options.Filters.Add(); }); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle services.AddEndpointsApiExplorer(); services.AddSwaggerGen(c => { //添加文档 c.SwaggerDoc("v1", new OpenApiInfo() { Title = "CallCenter Api", Version = "v1.0", Description = "呼叫中心api"}); //使用反射获取xml文件,并构造出文件的路径 var xmlFile = "document.xml"; //var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); // 启用xml注释. 该方法第二个参数启用控制器的注释,默认为false. c.IncludeXmlComments(xmlPath, true); var scheme = new OpenApiSecurityScheme() { Description = "Authorization header. \r\nExample: 'Bearer ***'", Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Authorization" }, Scheme = "oauth2", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, }; c.AddSecurityDefinition("Authorization", scheme); var requirement = new OpenApiSecurityRequirement(); requirement[scheme] = new List(); c.AddSecurityRequirement(requirement); }); //signalR builder.Services.AddSignalR().AddStackExchangeRedis(configuration.GetConnectionString("Redis"), options => { options.Configuration.ChannelPrefix = "callcenter:signalR:"; }); /* CORS */ services.AddCors(options => { options.AddPolicy(name: CorsOrigins, builder => { var origins = configuration.GetSection("Cors:Origins").Get(); builder.SetIsOriginAllowed(a => { return origins.Any(origin => origin.StartsWith("*.", StringComparison.Ordinal) ? a.EndsWith(origin[1..], StringComparison.Ordinal) : a.Equals(origin, StringComparison.Ordinal)); }) .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); }); }); //mapster var config = TypeAdapterConfig.GlobalSettings; services.AddSingleton(config); services.AddScoped(); //mediatr services.AddMediatR(Assembly.GetExecutingAssembly(), typeof(ApplicationStartupExtensions).Assembly); //迅时IPPBX var deviceConfigs = configuration.GetSection("DeviceConfigs").Get(); services.AddNewRock(deviceConfigs.Address); //sqlsugar services.AddSqlSugar(configuration, "CallCenter"); //cache services.AddCache(d => { d.ConnectionString = configuration.GetConnectionString("Redis"); d.Prefix = "CallCenter"; }); //validator services.AddFluentValidationAutoValidation(config => { config.DisableDataAnnotationsValidation = true; }) .AddValidatorsFromAssembly(typeof(AppContractsStartupExtensions).Assembly); return builder.Build(); } internal static WebApplication ConfigurePipelines(this WebApplication app) { app.UseSerilogRequestLogging(); var swaggerEnable = app.Configuration.GetSection("Swagger").Get(); // Configure the HTTP request pipeline. if (swaggerEnable) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseCors(CorsOrigins); app.UseAuthentication(); app.UseAuthorization(); //app.MapHub("/hubs/callcenter"); //app.UseMiddleware(); app.MapControllers() .RequireAuthorization(); return app; } }