StartupExtensions.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. using System.IdentityModel.Tokens.Jwt;
  2. using System.Reflection;
  3. using CallCenter.Api.Exceptions;
  4. using CallCenter.Api.Filters;
  5. using CallCenter.Api.Realtimes;
  6. using CallCenter.Devices;
  7. using CallCenter.NewRock;
  8. using CallCenter.Repository.SqlSugar;
  9. using Mapster;
  10. using MapsterMapper;
  11. using MediatR;
  12. using Microsoft.OpenApi.Models;
  13. using XF.Domain.Dependency;
  14. using CallCenter.Application;
  15. using CallCenter.Application.Contracts;
  16. using CallCenter.CacheManager;
  17. using FluentValidation;
  18. using FluentValidation.AspNetCore;
  19. using CallCenter.Settings;
  20. using Identity.Admin.HttpClient;
  21. using Microsoft.AspNetCore.Authentication.JwtBearer;
  22. using Microsoft.IdentityModel.Tokens;
  23. using Serilog;
  24. namespace CallCenter.Api;
  25. internal static class StartupExtensions
  26. {
  27. const string CorsOrigins = "CorsOrigins";
  28. internal static WebApplication ConfigureServices(this WebApplicationBuilder builder)
  29. {
  30. var services = builder.Services;
  31. var configuration = builder.Configuration;
  32. services.AddHttpContextAccessor();
  33. #if DEBUG
  34. builder.WebHost.UseUrls("http://192.168.100.36:50001", "http://localhost:50001");
  35. #endif
  36. services.Configure<DeviceConfigs>(d => configuration.GetSection("DeviceConfigs").Bind(d));
  37. services.Configure<WorkTimeSettings>(d => configuration.GetSection("WorkTimeSettings").Bind(d));
  38. // Add services to the container.
  39. services
  40. .BatchInjectServices()
  41. .AddApplication()
  42. ;
  43. //services.AddIdentityClient(
  44. // new IdentityClientConfiguration("http://identity.fengwo.com", "http://open.identity.fengwo.com"),
  45. // d =>
  46. // {
  47. // d.ClientId = "hotline_server";
  48. // d.ClientSecret = "ce2fae0e-f0f6-46d6-bd79-1f1a31dff494";
  49. // d.ClientScope = "identity.admin_api";
  50. // });
  51. //JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
  52. //services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  53. // .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, d =>
  54. // {
  55. // d.Authority = "http://identity.fengwo.com"; //todo
  56. // d.RequireHttpsMetadata = false;
  57. // d.TokenValidationParameters = new TokenValidationParameters
  58. // {
  59. // ValidateAudience = false
  60. // };
  61. // })
  62. // ;
  63. services.AddControllers(options =>
  64. {
  65. options.Filters.Add<TempTokenFilter>();
  66. options.Filters.Add<UnifyResponseFilter>();
  67. options.Filters.Add<UserFriendlyExceptionFilter>();
  68. });
  69. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  70. services.AddEndpointsApiExplorer();
  71. services.AddSwaggerGen(c =>
  72. {
  73. //添加文档
  74. c.SwaggerDoc("v1", new OpenApiInfo() { Title = "CallCenter Api", Version = "v1.0", Description = "呼叫中心api"});
  75. //使用反射获取xml文件,并构造出文件的路径
  76. var xmlFile = "document.xml";
  77. //var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
  78. var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
  79. // 启用xml注释. 该方法第二个参数启用控制器的注释,默认为false.
  80. c.IncludeXmlComments(xmlPath, true);
  81. var scheme = new OpenApiSecurityScheme()
  82. {
  83. Description = "Authorization header. \r\nExample: 'Bearer ***'",
  84. Reference = new OpenApiReference
  85. {
  86. Type = ReferenceType.SecurityScheme,
  87. Id = "Authorization"
  88. },
  89. Scheme = "oauth2",
  90. Name = "Authorization",
  91. In = ParameterLocation.Header,
  92. Type = SecuritySchemeType.ApiKey,
  93. };
  94. c.AddSecurityDefinition("Authorization", scheme);
  95. var requirement = new OpenApiSecurityRequirement();
  96. requirement[scheme] = new List<string>();
  97. c.AddSecurityRequirement(requirement);
  98. });
  99. ////signalR
  100. //builder.Services.AddSignalR().AddStackExchangeRedis(configuration.GetConnectionString("Redis"), options =>
  101. //{
  102. // options.Configuration.ChannelPrefix = "callcenter:signalR:";
  103. //});
  104. /* CORS */
  105. services.AddCors(options =>
  106. {
  107. options.AddPolicy(name: CorsOrigins,
  108. builder =>
  109. {
  110. var origins = configuration.GetSection("Cors:Origins").Get<string[]>();
  111. builder.SetIsOriginAllowed(a =>
  112. {
  113. return origins.Any(origin => origin.StartsWith("*.", StringComparison.Ordinal)
  114. ? a.EndsWith(origin[1..], StringComparison.Ordinal)
  115. : a.Equals(origin, StringComparison.Ordinal));
  116. })
  117. .AllowAnyHeader()
  118. .AllowAnyMethod()
  119. .AllowCredentials();
  120. });
  121. });
  122. //mapster
  123. var config = TypeAdapterConfig.GlobalSettings;
  124. services.AddSingleton(config);
  125. services.AddScoped<IMapper, ServiceMapper>();
  126. //mediatr
  127. services.AddMediatR(Assembly.GetExecutingAssembly(), typeof(ApplicationStartupExtensions).Assembly);
  128. //迅时IPPBX
  129. var deviceConfigs = configuration.GetSection("DeviceConfigs").Get<DeviceConfigs>();
  130. services.AddNewRock(deviceConfigs.Address);
  131. //sqlsugar
  132. services.AddSqlSugar(configuration, "CallCenter");
  133. //cache
  134. services.AddCache(d =>
  135. {
  136. d.ConnectionString = configuration.GetConnectionString("Redis");
  137. d.Prefix = "CallCenter";
  138. });
  139. //validator
  140. services.AddFluentValidationAutoValidation(config =>
  141. {
  142. config.DisableDataAnnotationsValidation = true;
  143. })
  144. .AddValidatorsFromAssembly(typeof(AppContractsStartupExtensions).Assembly);
  145. return builder.Build();
  146. }
  147. internal static WebApplication ConfigurePipelines(this WebApplication app)
  148. {
  149. app.UseSerilogRequestLogging();
  150. var swaggerEnable = app.Configuration.GetSection("Swagger").Get<bool>();
  151. // Configure the HTTP request pipeline.
  152. if (swaggerEnable)
  153. {
  154. app.UseSwagger();
  155. app.UseSwaggerUI();
  156. }
  157. app.UseCors(CorsOrigins);
  158. app.UseAuthentication();
  159. app.UseAuthorization();
  160. //app.MapHub<CallCenterHub>("/hubs/callcenter");
  161. //app.UseMiddleware<TempTokenMiddleware>();
  162. app.MapControllers()
  163. .RequireAuthorization();
  164. return app;
  165. }
  166. }