123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- using System.IdentityModel.Tokens.Jwt;
- using System.Reflection;
- using Exceptionless;
- using FluentValidation;
- using FluentValidation.AspNetCore;
- using Hotline.Api.Realtimes;
- using Hotline.Application;
- using Hotline.Application.Contracts;
- using Hotline.Application.Contracts.Configurations;
- using Hotline.CacheManager;
- using Hotline.CallCenter.Devices;
- using Hotline.Identity.Accounts;
- using Hotline.NewRock;
- using Hotline.Permissions;
- using Hotline.Repository.SqlSugar;
- using Hotline.Repository.SqlSugar.Extensions;
- using Hotline.Settings;
- using Mapster;
- using MapsterMapper;
- using MediatR;
- using Microsoft.AspNetCore.Authentication.JwtBearer;
- using Microsoft.AspNetCore.Authorization;
- using Microsoft.AspNetCore.Identity;
- using Microsoft.IdentityModel.Tokens;
- using Microsoft.OpenApi.Models;
- using Serilog;
- using XF.Domain.Dependency;
- using XF.Domain.Filters;
- using XF.Domain.Options;
- using XF.Domain.Password;
- namespace Hotline.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://*:50110");
- #endif
- services.Configure<DeviceConfigs>(d => configuration.GetSection(nameof(DeviceConfigs)).Bind(d));
- services.Configure<WorkTimeSettings>(d => configuration.GetSection(nameof(WorkTimeSettings)).Bind(d));
- services.Configure<IdentityConfiguration>(d => configuration.GetSection(nameof(IdentityConfiguration)).Bind(d));
- // Add services to the container.
- services
- .BatchInjectServices()
- .AddApplication()
- .AddScoped<IPasswordHasher<Account>, PasswordHasher<Account>>()
- ;
- //Authentication
- services.AddAuthenticationService(configuration);
- services.AddControllers(options =>
- {
- options.Filters.Add<UnifyResponseFilter>();
- options.Filters.Add<UserFriendlyExceptionFilter>();
- })
- .AddDapr(d =>
- {
- #if DEBUG
- d.UseHttpEndpoint("http://192.168.100.223:50112");
- #endif
- });
- // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
- services.AddEndpointsApiExplorer();
- services.AddSwaggerGen(c =>
- {
- //添加文档
- c.SwaggerDoc("v1", new OpenApiInfo() { Title = "Hotline 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<string>();
- 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<string[]>();
- 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<IMapper, ServiceMapper>();
- //mediatr
- services.AddMediatR(Assembly.GetExecutingAssembly(), typeof(ApplicationStartupExtensions).Assembly);
- //迅时IPPBX
- var deviceConfigs = configuration.GetSection("DeviceConfigs").Get<DeviceConfigs>();
- services.AddNewRock(deviceConfigs.Address);
- //sqlsugar
- services.AddSqlSugar(configuration, "Hotline");
- //cache
- services.AddCache(d =>
- {
- d.ConnectionString = configuration.GetConnectionString("Redis");
- d.Prefix = "Hotline";
- });
- //validator
- services.AddFluentValidationAutoValidation(config =>
- {
- config.DisableDataAnnotationsValidation = true;
- })
- .AddValidatorsFromAssembly(typeof(AppContractsStartupExtensions).Assembly);
- //ex log
- services.AddExceptionless(configuration);
- services.AddSingleton<IAuthorizationPolicyProvider, AuthorizationPolicyProvider>();
- services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
- return builder.Build();
- }
- internal static WebApplication ConfigurePipelines(this WebApplication app)
- {
- app.UseSerilogRequestLogging();
- var useExless = app.Configuration.GetSection("Exceptionless:InUse").Get<bool>();
- if (useExless)
- {
- app.UseExceptionless();
- }
- var swaggerEnable = app.Configuration.GetSection("Swagger").Get<bool>();
- // Configure the HTTP request pipeline.
- if (swaggerEnable)
- {
- app.UseSwagger();
- app.UseSwaggerUI();
- }
- app.UseCors(CorsOrigins);
- app.UseAuthentication();
- app.UseAuthorization();
- app.MapHub<CallCenterHub>("/hubs/callcenter");
- //app.UseMiddleware<TempTokenMiddleware>();
- app.UseCloudEvents();
- app.MapControllers()
- .RequireAuthorization();
- app.MapSubscribeHandler();
- return app;
- }
- }
|