DotNetCore跨平台~聊聊中间件

回到目录html

在进行.net core平台以后,咱们若是但愿在请求过程当中添加一些事件是很是容易的,你能够把这些事件作成一个中间件Middleware,而后这些中间件就会以Http pipeline的管道方式进行相应,而且它们就像是一个职责链,从你定义的第一个中间件开始,一个一个向下传递,直到最后一个中间件完成为止!api

前几天我写了在.net core里实现模块化服务,DotNetCore跨平台~组件化时代来了 主要是将咱们定义的组件添加到IServiceCollection集合里,而后在程序启动后去注册它们,而今天要说的Middleware用到的是IApplicationBuilder,它在程序启动后,加载与http请求相关的组件,这些组件以Pipeline的形式进行处理,也就是咱们所说的中间件,下面我来带你们实现一个最简单的Middleware!mvc

从网上找的图,挺形象app

图中记录了一个请求进来,通过各个中间件的处理,最后逐个响应,下面咱们来看一下简单的代码实现,和服务组件化同样,也是一个实现,一个扩展方法的调用,最后在startup里去使用它。框架

大叔Lind.DotNetCore框架里的Middlewareasync

ResponseTimeMiddleware的实现模块化

    /// <summary>
    /// 响应时间的中间件
    /// </summary>
    public class ResponseTimeMiddleware
    {
        private readonly RequestDelegate _next;
        public ResponseTimeMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Console.WriteLine("ResponseTimeMiddleware...");
            await _next.Invoke(context);
            sw.Stop();
            Console.WriteLine($"页面响应时间为:{sw.ElapsedMilliseconds}ms");
        }

    }

扩展方法去封装它,以便于其它地方去使用它组件化

    /// <summary>
    /// Lind.DotNetCore.Middleware扩展方法
    /// </summary>
    public static class MiddlewareExtensions
    {
        public static IApplicationBuilder UseResponseTime(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<ResponseTimeMiddleware>();
        }

        public static IApplicationBuilder UseRequestKey(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<RequestKeyMiddleware>();
        }

        public static IApplicationBuilder UseAuthorizationOperation(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<AuthorizationOperationMiddleware>();
        }

    }

最后在startup里使用它,注意是在AddMvc方法前面,要否则对你的mvc,api是无效的,呵呵!post

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseAuthorizationOperation(); app.UseResponseTime(); app.UseRequestKey();
            app.UseStaticHttpContext();
            app.UseMvc();

事实上,今天的中间件是.net core里很是大的亮点,其实早就应该写这篇文章了,呵呵!ui

感谢各位的阅读!

回到目录

相关文章
相关标签/搜索