zoukankan      html  css  js  c++  java
  • .NET Core开发日志——Middleware

    1 什么是中间件(Middleware)?

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

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

    请求委托(Request delegates)用于构建请求管道,处理每个HTTP请求。

    请求委托使用RunMapUse扩展方法进行配置。单独的请求委托可以以内联匿名方法(称为内联中间件)指定,或者可以在可重用的类中定义它。这些可重用的类和内联匿名方法是中间件或中间件组件。请求流程中的每个中间件组件都负责调用流水线中的下一个组件,如果适当,则负责链接短路。

    将HTTP模块迁移到中间件解释了ASP.NET Core和以前版本(ASP.NET)中的请求管道之间的区别,并提供了更多的中间件示例。

    2 中间件(Middleware)与 HTTP Modules与HTTP Handlers 关联

    熟悉ASP.NET架构的开发者一定对于HTTP Modules与HTTP Handlers不陌生。两者的作用主要是对网络请求执行特定的处理工作。而在.NET Core中,它们都被Middleware(中件间)取代了。

    之前的Http Modules和HTTP Handlers是如下图般处理请求的:

    现在变成了这样:

    一言概括之,Middleware完成了HTTP Modules与HTTP Handlers的原有工作,但又不是简单的化二为一的减法作用。

    Middleware减去的其实是与原来ASP.NET中重要的基础——应用程序生命周期事件(application life cycle event)的绑定。

    HTTP Modules在初始化时就需要针对HttpApplication的事件作绑定处理,这样当HttpApplication的各项事件被触发时,已绑定的相应处理程序才会按照预期的那样被执行。

    如果是用Middleware的话,事情就变得很简单了。抛弃IHttpModule接口及HttpModule实现类,不用再关心HttpApplication的任何事件,还有烦人的web.config配置。直接在代码中以最简洁的方式完成工作。

        public void Configure(IApplicationBuilder app, IHostingEnvironment env){
        app.Use(async(context, next) =>{    
           await context.Response.WriteAsync("Beginning of Request\n");  
               await next.Invoke();      
               await context.Response.WriteAsync("End of Request\n");    });    app.Run(async (context) =>    {        await context.Response.WriteAsync("Hello World!\n");    }); }

    3 中间件使用

    Use, Run, 和 Map

    你可以使用UseRunMap配置HTTP管道。Use方法可以使管道短路(即,可以不调用下一个请求委托)。Run方法是一个约定, 并且一些中间件组件可能暴露在管道末端运行的Run [Middleware]方法。Map*扩展用作分支管道的约定。映射根据给定的请求路径的匹配来分支请求流水线,如果请求路径以给定路径开始,则执行分支。

    public class Startup
    {
        private static void HandleMapTest1(IApplicationBuilder app)
        {
            app.Run(async context =>
            {
                await context.Response.WriteAsync("Map Test 1");
            });
        }
    
        private static void HandleMapTest2(IApplicationBuilder app)
        {
            app.Run(async context =>
            {
                await context.Response.WriteAsync("Map Test 2");
            });
        }
    
        public void Configure(IApplicationBuilder app)
        {
            app.Map("/map1", HandleMapTest1);
    
            app.Map("/map2", HandleMapTest2);
    
            app.Run(async context =>
            {
                await context.Response.WriteAsync("Hello from non-Map delegate. <p>");
            });
        }
    }

    内置中间件

    ASP.NET Core附带以下中间件组件:

    中间件描述
    Authentication 提供身份验证支持
    CORS 配置跨域资源共享
    Response Caching 提供缓存响应支持
    Response Compression 提供响应压缩支持
    Routing 定义和约束请求路由
    Session 提供用户会话管理
    Static Files 为静态文件和目录浏览提供服务提供支持
    URL Rewriting Middleware 用于重写 Url,并将请求重定向的支持
     


    4 中间件 优点

    总结下使用Middleware的优点:

    • 没有对HttpApplication的依赖

    • 没有对IHttpModule与IHttpHandler接口的依赖

    • 无需在web.config文件中添加各种配置

    • 代码简洁

    最后需要补充Middleware与HTTP Modules的一点差异。各Middleware中处理请求与响应的顺序是刚好相反的,越早处理请求的Middleware越晚处理响应。而HTTP Modules中处理请求与响应的顺序则保持一致,因为每个HTTP Module请求与响应事件的绑定都是在同一阶段完成的。

    坚持就是力量 量变造就质变
  • 相关阅读:
    正则匹配任意字(包括换行符)
    linux终端光标的快捷键操作
    正则向前查找和向后查找
    正则表达式软件Expresso
    JsonP 跨域完全解析
    PHP代码阅读Phpxref
    ubuntu 操作用户名和密码
    curl多线程解释[转]
    php递归创建多级目录
    离散数学 第一章 命题逻辑 11 命题及其表示法
  • 原文地址:https://www.cnblogs.com/songxm/p/14479130.html
Copyright © 2011-2022 走看看