因要定义一个验证特性而引起的中间件学习

中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件:

  • 选择是否将请求传递到管道中的下一个组件。
  • 可在管道中的下一个组件前后执行工作。

请求委托用于生成请求管道, 请求委托处理每个 HTTP 请求。

1.中间件的定义

使用 UseRun 和 Map 配置 HTTP 管道。 Use 方法可使管道短路(即不调用 next 请求委托)。 Run 是一种约定,并且某些中间件组件可公开在管道末尾运行的 Run[Middleware] 方法。

Map 扩展用作约定来创建管道分支。 Map* 基于给定请求路径的匹配项来创建请求管道分支。 

2.中间件的使用

  概念性的东西,我们可以在网上找一大堆. 就不多说了.  下面我距离两种定义方式, 如果各位大神有其他的方式, 欢迎留言.  

第一种是, 直接用app.UseMiddleware . 代码如下: 这里定义一个常规类MyMiddle . DataResult是我自定义实体类,用于返回公用信息的.

 public class MyMiddle
    {
        private readonly RequestDelegate _next;
        public MyMiddle(RequestDelegate next)
        {
            this._next = next;
        }


        public Task Invoke(HttpContext context)
        {
            DataResult result = new DataResult()
            {
                verifiaction = false,
                message = "管道失效" + context.Request.Host.Value.ToString()
            };


            return context.Response.WriteAsync(JsonConvert.SerializeObject(result));
             
        }
    }

然后在 StartUp.cs  的 Configure 方法添加

app.UseMiddleware<MyMiddle>();

结果返回 dataresult 实体字符.

第二种 是用静态的, 也就是类似于内部本身提供的. 如app.UseCores(),  app.UseMvc() .

首先, 定义自定义中间件静态类, 空间明明是 Microsoft.AspNetCore.Builder

namespace Microsoft.AspNetCore.Builder
{
    public static class MMidelExtensions
    {
        public static IApplicationBuilder MMidel(this IApplicationBuilder app)
        {
            DataResult result = new DataResult()
            {
                verifiaction = true,
                message = "中间件的另一种写法"
            };
            Func<RequestDelegate, RequestDelegate> middleware = next =>
            { 
                return context =>
                { 
                    return context.Response.WriteAsync(JsonConvert.SerializeObject(result));
                };
            };
            return app.Use(middleware);
        }
    }
}

用法如下:  StartUp.cs  的 Configure 方法添加 

app.MMidel();

其实, 实际应用有很多方面, 比如, token验证, 还有暴力攻击拦截等等...都可以用中间件来进行拦截操作. 

猜你喜欢

转载自www.cnblogs.com/mylinx/p/10494652.html