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();            
        }

       
    }

咱来看看启动效果

 

 

 

posted on 2019-09-28 14:30  zhang盼  阅读(135)  评论(0)    收藏  举报