net core 之 middleware(3)
2.netcore middleware
在netcore middleware这么例子中,我又穿插了微软自带的另外一个AOP利器Filter拦截器,middleware(中间件)和Filter(拦截器)既有相同拦截处理功能,过滤器和中间件他们的关注点是不一样的,也就是说职责不一样,一般中间件用于和业务关系不大的一些需要在管道中做的事情可以使用,比如身份验证,Session存储,日志记录等,而过滤器更贴合业务,它关注于应用程序本身,比如你看ActionFilter 和 ResultFilter,但是在net core中也可以用在管道中
咱来看看他们之前的区别
public class AuditMiddleware { private readonly RequestDelegate _next; public AuditMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { string reqParams = string.Empty; if (string.Equals(context.Request.Method, "POST", StringComparison.OrdinalIgnoreCase)) { var reader = new StreamReader(context.Request.Body); reqParams = reader.ReadToEnd(); } else if (string.Equals(context.Request.Method, "GET", StringComparison.OrdinalIgnoreCase)) { reqParams = context.Request.QueryString.ToString(); } Console.WriteLine($"请求前,请求路径:{context.Request.Path},请求参数:{reqParams}"); await _next.Invoke(context); Console.WriteLine("AuditMiddleware请求后"); } }
public class AuditFilter : Attribute, IActionFilter { public void OnActionExecuted(ActionExecutedContext context) { Console.WriteLine("AuditFilter请求后"); } public void OnActionExecuting(ActionExecutingContext context) { string reqParams = string.Empty; if (string.Equals(context.HttpContext.Request.Method, "POST", StringComparison.OrdinalIgnoreCase)) { var reader = new StreamReader(context.HttpContext.Request.Body); reqParams = reader.ReadToEnd(); } else if (string.Equals(context.HttpContext.Request.Method, "GET", StringComparison.OrdinalIgnoreCase)) { reqParams = context.HttpContext.Request.QueryString.ToString(); } Console.WriteLine($"请求前,请求路径:{context.HttpContext.Request.Path},请求参数:{reqParams}"); } }
接下来看看他们的注入方式,拦截器我写了一个自己的扩展
public static class MvcFilterExtend { public static IMvcBuilder AddMvcFilter(this IMvcBuilder builder) { if (builder == null) throw new ArgumentNullException(nameof(builder)); return builder.AddMvcOptions(options => { options.Filters.Add(typeof(AuditFilter)); options.Filters.Add(typeof(ExceptionFilter)); }); } public static IMvcCoreBuilder AddMvcCoreFilter(this IMvcCoreBuilder builder) { if (builder == null) throw new ArgumentNullException(nameof(builder)); return builder.AddMvcOptions(options => { options.Filters.Add(typeof(AuditFilter)); options.Filters.Add(typeof(ExceptionFilter)); }); } }
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddMvc() .AddMvcFilter() .SetCompatibilityVersion(CompatibilityVersion.Version_2_2); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseMiddleware<AdapterMiddleware>(); app.UseMiddleware<AuthMiddleware>(); app.UseMiddleware<AuditMiddleware>(); app.UseMvc(); } }
浙公网安备 33010602011771号