网站首页 文章专栏 【Welcome to .NET Core】ASP.NET Core中间件介绍
【Welcome to .NET Core】ASP.NET Core中间件介绍
编辑时间:2017-08-30 22:13 作者:Absolutely 浏览:1823 评论:20

      前言:.Net Core入门学习中,还望各位大神多多指点,理解有误的地方还望指正。


一、简单介绍

       中间件是用于组成应用程序请求管道的组件,用于处理请求和响应。管道内的每一个组件都可以将请求传递给下一个组件或者停止传递。


       请求委托通过IApplicationBuilder接口的Run、Map和Use扩展方法来配置,IApplicationBuilder会在Startup类中传递给Configure方法,每个单独的请求委托都可以被指定为一个内嵌的匿名方法:

    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World!");
    });
       或者定义在一个可重用的类中,这些可重用的类被称作“中间件”或“中间件组件”。


       下面我们看看Visual Studio 2017创建的ASP.NET Core 2.0 MVC模板中关于请求管道的配置。

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

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
       可以看到使用的中间件有:异常处理(同时针对开发环境和非开发环境)、静态文件、MVC。


       上面代码在非开发环境时,UseExceptionHandler时第一个被加入到请求管道的中间件。此后将会捕捉之后发生的任何异常,然后跳转到异常页(/Home/Error)。一般会把异常处理放在前面,这样可以捕捉后续调用中间件发生的异常。

       接下来是静态文件中间件,它将提供位于wwwroot下的文件的访问权限,并且是完全公开,如果想基于授权来提供这些文件,就不能放在wwwroot,而是放在之外的目录通过控制器判断授权,再由FileResult来提供文件。

       被静态文件处理的请求会在管道中短路。如果该请求不是由静态文件处理则会执行最后的MVC框架。

二、Run、Map、Use方法

       可以使用IApplicationBuilder接口的Run、Map和Use方法来配置HTTP管道。

       Run扩展方法会短路管道,因为他不能调用next委托。因此Run方法一般只在管道底部被调用。

       Use方法有一个IApplicationBuilder接口公开的Use方法,还有个Use扩展方法:

    app.Use(async (context, next) =>
    {
        await context.Response.WriteAsync("Hello World!");
        await next.Invoke();
    });
       如果Use扩展方法中谢了next.Invoke(),将会调用下一个中间件,否则将会短路管道(等效于Run方法)。


       MapMapWhen扩展方法则可用于分支管道。Map方法用于匹配基于请求路径的请求委托,MapWhen方法用于匹配基于谓词的中间件分支。两者配置单独的中间件管道功能。

    //基于请求路径的管道分支
    app.Map("/Home/Index", (subApp) =>
    {
        subApp.Run(async (context) =>
        {
            await context.Response.WriteAsync("Request URL is '/Home/Index'");
        });
    });
    //基于谓词的管道分支
    app.MapWhen(context =>
    {
        return !context.WebSockets.IsWebSocketRequest;
    }, (subApp) =>
        {
            subApp.Run(async (context) =>
            {
                await context.Response.WriteAsync("This is not a WebSocketRequest");
            });
        });

       上面代码的Map方法导致任何基于路径/Home/Index的请求都会被管道中配置的匿名方法(也就是参数为subApp的那个)处理。而MapWhen方法则导致任何不是WebSocketRequest的请求被对应的方法(同上)处理。

       :MapWhen的第一个参数类型为Func<HttpContext,bool>。

       上面代码执行结果为:

执行结果

三、ASP.NET Core常用中间件组件

       1.会话(Session

       2.缓存(Caching

       3.路由(Routing

       4.静态文件(StaticFiles)

       5.跨域资源共享(CQRS)

       6.安全认证(Security)



      结语:本文只做了ASP.NET Core中间件的基本介绍,后续进行中间件的实战Demo。
       出自:不落阁

       地址:http://www.lyblogs.cn/Article/Detail/LY08302213354352

       转载请注明出处!

来说两句吧
最新评论
  • 有毒的地狱野猪肉
    有毒的地狱野猪肉 2018-01-07 19:28:23
    看看
  • Mr.张
    Mr.张 2018-01-11 14:38:51
    hello world!
  • Dust Laden Memory
    Dust Laden Memory 2018-01-12 23:25:52

    支持一下!

  • 盛浩南
    盛浩南 2018-01-13 16:56:19
    666666
  • 加菲猫
    加菲猫 2017-09-01 00:13:28

    p评论一下吧


  • Jesse Zhu
    Jesse Zhu 2017-09-12 16:03:16
    豆腐干
  • Jesse Zhu
    Jesse Zhu 2017-09-12 16:03:22
    速度
  • Jesse Zhu
    Jesse Zhu 2017-09-14 09:58:15
    士大夫
  • 沉迷学习
    沉迷学习 2017-09-14 20:54:35
    这后台是用netcore写的吗
  • Absolutely
    Absolutely 2017-09-15 15:50:15
    并不是,不过下一个产品是用.net Core写
  • 22
    22 2017-09-18 19:29:56
    学习一下
  • Bright Star
    Bright Star 2017-09-21 10:32:38
    [嘻嘻]哈哈
  • 相聚一刻
    相聚一刻 2017-09-21 10:56:16
    123123123
  • 长恨 
    长恨  2017-09-21 16:33:47
    评论
  • 杨二郎
    杨二郎 2017-10-02 22:14:41
    厉害了
  • 犇
    2017-10-26 10:57:02
    @加菲猫
  • 星尘
    星尘 2017-11-03 08:58:12
    东方闪电
  • 宇宙星辰老祖
    宇宙星辰老祖 2017-12-10 12:01:31
    en
  •      
          2017-12-19 20:06:55
    向大佬学习!
  • Merlin
    Merlin 2017-12-20 14:56:43
    test