Fork me on GitHub

.NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服务

.NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作

.NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务

.NetCore 下开发独立的(RPL)含有界面的组件包 (三)构建界面

.NetCore 下开发独立的(RPL)含有界面的组件包 (四)授权过滤

.NetCore 下开发独立的(RPL)含有界面的组件包 (五)授权过滤参数处 理

.NetCore 下开发独立的(RPL)含有界面的组件包 (六)实现业务功能

在.netcore中大家经常会看到 app.usexxxx()  ,services.addxxxx()等形式的方法

接下来我们就来扩展下这个组件,新建了一个扩展类Idr4AdminChinaExtensions

public static class Idr4AdminChinaExtensions
    {

        public static void UseAdminChina(this IApplicationBuilder app, Action<DashboardOptions> options = null)
        {
          /**/    

        }
        public static IServiceCollection AddAdminChina(this IIdentityServerBuilder services)
        {
          
            return services.Services;
        }
    }    

这里我写了这样的两个扩展方法,一个用于扩展IApplicationBuilder实现中间件处理,一个扩展了IIdentityServerBuilder实现IdentityServer4的一些服务

那么这个中间件要干什么呢?如实现某一个地址的时候显示一个页面,DashboardOptions是为了接受中间的参数信息,如hangfire的写法,你访问 localhost:10000/hangfire就会出现它的dashboard

 app.UseHangfireDashboard("/hangfire", new DashboardOptions
            {
                Authorization = new[] { new DashboardAuthorizeFilter() }
            });

好,接下来我们去添加中间件,我建立了中间价类

 

 关于中间这块之前有说过,主要就是对 RequestDelegate 的理解

public class AdminChinaMiddeware
    {
        public RequestDelegate _next;
        private DashboardOptions _options;
        public AdminChinaMiddeware(RequestDelegate next, DashboardOptions options)
        {
            _next = next;
            _options = options;
        }
        public async Task Invoke(HttpContext context)
        {
          
          await _next(context);
        }
    }

建立好中间件后,我们在扩展方法中添加

public static void UseAdminChina(this IApplicationBuilder app, Action<DashboardOptions> options = null)
        {
        
            var dashboardOptions = new DashboardOptions();
            options?.Invoke(dashboardOptions);
            app.UseMiddleware<AdminChinaMiddeware>(dashboardOptions);



        }

下面来看下DashbardOptions的处理,我没有直接指定地址,而是将地址放在了这个类中来处理,这里添加授权过滤接口,以便实现授权过滤处理

  public class DashboardOptions
    {
        public DashboardOptions()
        {
            AppPath = "/";
            PathRoute = "/adminchina";
            
        }
        /// <summary>
        /// 返回应用路径地址
        /// </summary>
        public string AppPath { get; set; }
        /// <summary>
        /// route 地址
        /// </summary>
        public string PathRoute { get; set; }
        
    }

如果,你需要使用直接的地址可以使用Map来处理,如下接受一个pathstring的参数

app.Map(new PathString("/adminchina"), appbuilder =>
            {
                app.UseMiddleware<AdminChinaMiddeware>(dashboardOptions);
            });

下面我们在中间中改一个输出看一看效果,在中间件类中添加如下输出我的名称,当路由到我指定的地址的时候 输出下我的名称

  string routeUrl = context.Request.Path;
            if (routeUrl.Equals(_options.PathRoute))
            {
                await context.Response.WriteAsync("liyouming");
            }

            else
            {
                await _next(context);
            }

 

 

接下里在这里添加引用,并在Startup里面写上我们的中中间件运行

 

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
            }
            app.UseAdminChina();
            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseMvc();
        }

可以看到第一个页面是自带的页面

 

然后我们注入指定的地址 ,我们的中间就基本处理好了

 当然这里紧紧是基本,这样基本了解了中间件的业务路数了

 

posted @ 2018-12-28 17:48  龙码精神  阅读(571)  评论(0编辑  收藏  举报