最开始,我是打算用autofac的高级特性的拦截器来作AOP的,可是遇到一个问题,poco controller没办法注入到autofac的容器里面.致使拦截器不能正常工做,因此就采用了筛选器来作.这里的场景有如下几个:git
public override IServiceCollection AddServices(IServiceCollection services) { services.AddMvc().AddNewtonsoftJson(options => { // 忽略循环引用 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // 不使用驼峰 options.SerializerSettings.ContractResolver = new DefaultContractResolver(); // 设置时间格式 options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; }).AddMvcOptions(options => { // 禁用Version的绑定 options.ModelMetadataDetailsProviders.Add(new ExcludeBindingMetadataProvider(typeof(System.Version))); // 统一事务处理中间件 options.Filters.Add(typeof(MbpTransActionFilter)); // 统一日志处理中间件 options.Filters.Add(typeof(MbpLogFilter)); // 请求响应统一格式处理中间件 options.Filters.Add(typeof(ResponseMiddleware)); }); ; AddAutoWebApi(services, new AutoWebApiOptions()); // 建立Cors策略 services.AddCors(options => { options.AddPolicy("MbpCors", builder => { builder.WithOrigins(services.BuildServiceProvider().GetService<IConfiguration>().GetSection("AllowedHosts").Value) .AllowAnyMethod() .AllowAnyHeader(); ; }); }); return base.AddServices(services); } public override void UseModule(IApplicationBuilder app) { // 启用跨域请求中间件 app.UseCors("MbpCors"); // 启用应用服务层全局错误处理中间件 app.UseMiddleware(typeof(MbpGlobaExceptionMiddleware)); base.UseModule(app); }
public async Task InvokeAsync(HttpContext context, ILogger<MbpGlobaExceptionMiddleware> logger) { try { // Call the next delegate/middleware in the pipeline await _next(context); } catch (DbUpdateConcurrencyException ex) { // 发生冲突时候,牺牲后者.不作具体数据合并操做.提示当前用户数据已经发生修改,须要重试. logger.LogError("并发冲突:" + ex.Message); context.Response.ContentType = "application/json"; await context.Response.WriteAsync(JsonConvert.SerializeObject(new { Code = 500, Message = "提交并发冲突", Version = "1", Data = new List<object>() })); } catch (Exception ex) { // 其余异常 logger.LogError($"请求[{context.Request.Path}]发生异常:" + ex.Message); context.Response.ContentType = "application/json"; await context.Response.WriteAsync(JsonConvert.SerializeObject(new { Code = 500, Message = "服务器异常", Version = "1", Data = new List<object>() })); } }
代码详细地址:https://github.com/mbpframework/Mbpgithub