net core 之 middleware(2)
说起中间件,从上篇文章中应该可以看出它位于Service(服务)和Application(应用层)之间,就可以看出Middleware(中间件)处理的是服务启动之后,应用调用之前处理的业务,其实中间件也是AOP(面向切面编程)一种实现。今天我将从两方面开始讲解middleware,framework和net core。
1.framework
首先我们先创建一个framework的控制台,并添加如下红框中的引用

然后我们编写几个简单的中间件AuthMiddleware(认证中间件)、AuditMiddleware(审计中间件)、AdapterMiddleware(适配中间件),重要说一下framework版本的中间件需要继承OwinMiddleware
public class AuthMiddleware : OwinMiddleware { public AuthMiddleware(OwinMiddleware next) : base(next) { } public override Task Invoke(IOwinContext context) { if (!string.Equals(context.Request.Path.ToString(), "/")) { var headers = context.Request.Headers; var account = headers["account"]; var password = headers["password"]; if (!string.Equals(account, "admin", StringComparison.OrdinalIgnoreCase) && !string.Equals(password, "123", StringComparison.OrdinalIgnoreCase)) { context.Response.StatusCode = 401; context.Response.WriteAsync("Unprivileged access"); Console.WriteLine("Unprivileged access"); return Task.FromResult(0); } } return Next.Invoke(context); } }
public class AuditMiddleware : OwinMiddleware { public AuditMiddleware(OwinMiddleware next) : base(next) { } public override Task Invoke(IOwinContext context) { string reqParams = string.Empty; // 暂时只处理GET和POST两种请求数据处理 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}"); return this.Next.Invoke(context); } }
public static class AdapterMiddleware { public static IAppBuilder UseAdapter(this IAppBuilder app) { app.MapWhen(x => x.Request.Path.Value.Contains("A"), A); app.MapWhen(x => x.Request.Path.Value.Contains("B"), B); return app; } public static void A(IAppBuilder app) { app.Run(async handler => { Console.WriteLine("A"); }); } public static void B(IAppBuilder app) { app.Run(async handler => { Console.WriteLine("B"); }); } }
然后我们切到入口程序,我们添加服务监听及启动中间件
class Program { static void Main(string[] args) { WebApp.Start<StartUp>("http://192.168.70.98:8889"); Console.ReadLine(); } } public class StartUp { public void Configuration(IAppBuilder app) { var config = new HttpConfiguration(); app.UseWebApi(config); app.Use<AuditMiddleware>(); app.Use<AuthMiddleware>(); app.UseAdapter(); } }
咱来看看启动效果


浙公网安备 33010602011771号