5_中间件

什么是中间件

中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件:
选择是否将请求传递到管道中的下一个组件。
可在管道中的下一个组件前后执行工作。

请求委托用于生成请求管道。 请求委托处理每个 HTTP 请求。使用 RunMap 和 Use 扩展方法来配置请求委托。

中间件的流程

ASP.NET Core 请求管道包含一系列请求委托,依次调用。
image

中间件与过滤器的区别

中间件和过滤器的作用很相似,但是针对的点不一样

过滤器更贴合业务,它关注于应用程序本身,比如你看ActionFilter 和 ResultFilter,它都直接和你的Action,ActionResult交互了,是不是离你很近的感觉,那我有一些比如对我的输出结果进行格式化啦,对我的请求的ViewModel进行数据验证,就用Filter。它是MVC的一部分,它可以拦截到你Action上下文的一些信息,而中间件是没有这个能力的。

什么情况我们需要中间件

那么,何时使用中间件呢?我的理解是在我们的应用程序当中和业务关系不大的一些需要在管道中做的事情可以使用,比如身份验证,Session存储,我们的 asp.net core项目中本身已经包含了很多个中间件。mvc本日志记录,移除处理等。其实身也是一个中间件。

创建自己的中间件

项目里新建一个文件夹Middleware,然后在里面创建中间件。

自定义一个中间获取请求的ip地址

namespace MyFirstNetCore.Middleware
{
    //自定义中间件实现ip地址获取
    public class RequestIPMyMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger _logger;
        public RequestIPMyMiddleware(RequestDelegate next, ILoggerFactory logger)
        {
            _next = next;
            _logger = logger.CreateLogger<RequestIPMyMiddleware>();
        }
        public async Task Invoke(HttpContext context)
        {
            _logger.LogInformation("自定义中间件被;执行了");
            _logger.LogInformation("获取ip地址:" + context.Connection.RemoteIpAddress.ToString());
            await _next.Invoke(context); //执行下一个中间件
        }

    }
}

然后在Startup类的Configure方法里使用(注入)该中间件即可

app.UseMiddleware<RequestIPMyMiddleware>();

运行项目即可,看到,它比任何筛选器都先执行。
image

像其它系统中间那样使用

image

想像上图中的那样使用,要为中间件定义为一个扩展方法,在个扩展方法里注入中间件即可。
创建一个RequestIPMyMiddlewareExtensions静态类,里面创建一个UseMyIp扩展方法。

namespace MyFirstNetCore.Middleware
{
    public static class RequestIPMyMiddlewareExtensions
    {
        public static IApplicationBuilder UseMyIp(this IApplicationBuilder app)
        {
            app.UseMiddleware<RequestIPMyMiddleware>();

            return app;
        }
    }
}

然后Startup类的Configure方法里即可像普通中间件那样注入了。
app.UseMyIp();

posted @   青仙  阅读(96)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示