最開始,我是打算用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