using System.Reflection; using DS.Module.Core; using DS.Module.Core.Extensions; using DS.Module.Core.Filters; using DS.Module.Core.Helpers; using DS.Module.Core.Modules; using DS.Module.Core.Reflection; using DS.Module.Jwt; using DS.Module.Log; using DS.Module.SqlSugar; using DS.Module.Swagger; using DS.Module.User; using DS.WMS.Core.DBSeed; using DS.WMS.Core.System.Dtos; using FluentValidation.AspNetCore; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; namespace DS.WMS.WebApi; /// /// 基础模块 /// [DSDependsOn( typeof(DependencyAppModule), typeof(NLogModule), typeof(SqlSugarModule), typeof(SwaggerModule), typeof(JwtModule), typeof(UserModule))] public class DSAppWebModule : DSAppModule { private string policyName = string.Empty; /// /// /// /// public override void ConfigureServices(ConfigureServicesContext context) { var service = context.Services; // service.Configure(options => // { // // 禁用默认模型验证过滤器 // options.SuppressModelStateInvalidFilter = true; // }); service.AddControllersWithViews(options => { // 全局添加自定义模型验证过滤器 // options.Filters.Add(); //全局异常过滤 options.Filters.Add(); options.SuppressAsyncSuffixInActionNames = false; //x.Filters.Add(); }) .AddFluentValidation(config => //添加FluentValidation验证 { //程序集方式添加验证 config.RegisterValidatorsFromAssemblyContaining(typeof(UserLoginValidation)); //是否与MvcValidation共存 config.DisableDataAnnotationsValidation = true; }) .ConfigureApiBehaviorOptions(options => { //使用自定义模型验证 options.InvalidModelStateResponseFactory = (context) => { var errors = context.ModelState .Where(e => e.Value.Errors.Count > 0) .Select(e => e.Value.Errors.First().ErrorMessage) .ToList(); var result = DataResult.Failed(string.Join("|", errors)); return new JsonResult(result); }; }) //全局配置Json序列化处理 .AddNewtonsoftJson(options => { // 首字母小写(驼峰样式) options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); // 时间格式化 options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; // 忽略循环引用 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // 忽略空值 options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; }); //跨域请求 policyName = AppSetting.Configuration["Cors:PolicyName"]; var corsUrl = AppSetting.Configuration["Cors:Url"]; service.AddCors(c => { c.AddPolicy(policyName, policy => { policy.WithOrigins(corsUrl .Split(",", StringSplitOptions.RemoveEmptyEntries).ToArray()) //policy.WithOrigins("http://localhost:5001")//支持多个域名端口,注意端口号后不要带/斜杆:比如localhost:8000/,是错的 .AllowAnyHeader().AllowAnyMethod().AllowCredentials(); //允许cookie; }); }); } // /// // /// 获取所有的FluentValidation Validator的类 // /// // public IEnumerable GetFluentValidationValidator(string assemblyName) // { // if (assemblyName == null) // throw new ArgumentNullException(nameof(assemblyName)); // if (string.IsNullOrEmpty(assemblyName)) // throw new ArgumentNullException(nameof(assemblyName)); // // var implementAssembly = AssemblyHelper.GetAssembliesByName(assemblyName); // if (implementAssembly == null) // { // throw new DllNotFoundException($"the dll ConferenceWebApi not be found"); // } // var validatorList = implementAssembly.Where(e => e.FullName.EndsWith("Validator")); // return validatorList; // } /// /// /// /// public override void ApplicationInitialization(ApplicationContext context) { var applicationBuilder = context.GetApplicationBuilder(); if (!policyName.IsNullOrEmpty()) { applicationBuilder.UseCors(policyName); //添加跨域中间件 } applicationBuilder.UseRouting(); applicationBuilder.UseStaticFiles(); } }