zoukankan      html  css  js  c++  java
  • DotNet Core2.1 编写自己的中间件和后台服务

    .Net Core已经发布了很久了,因为项目原因,迟迟没有使用,在最近这几天里面,对其中关键的一些概念和功能进行学习,并记录了下来,希望在帮助自己记忆的同时也能帮助到其他有需要的同学。

    1.中间件

    1.1 中间件的简介

    中间件是.Net Core中很重要的概念,也是区别.Net Framework的一大特色。使用中间件,将系统的权限控制,Session,日志等功能都统一了起来。

    请求处理模式显示请求到达、通过三个中间件进行处理以及响应离开应用。图片来之微软

    如上图所示在给浏览器发请求的过程中,会依次先经过中间件,对请求进行一定的处理,然后再进入Action进行操作,因此一些权限控制等操作(AOP操作)就可以在中间件中执行。

    1.2 Startup类在程序启动时的运行流程

    在使用该功能之前,我们需要知道程序在Startup中的运行大致过程。

    首先我们需要知道程序在启动的时候是先进入Startup类中的ConfigureServices为程序添加一些额外的服务,然后进入Configure配置网站的中间件。

    public class Startup
    {
        // 向程序添加服务
        public void ConfigureServices(IServiceCollection services)
        {
            ...
        }
    
        // 配置程序的中间件操作
        public void Configure(IApplicationBuilder app)
        {
            ...
        }
    }

    比如我们想在程序启动的时候做一些工作,在.Net Framework中我们需要在global.asax中的Application_Start方法中配置适当算法,而.Net Core中我们就需要在ConfigureServices方法中编写同样的代码。只不过操作方式是以,为IServiceCollection集合添加服务的方式进行的。

    1.3 编写自己的中间件

    Asp .Net Core已经内置了一些中间件,具体可以查看官网  链接

    在这里我们只讨论如何编写自己的中间件

    编写过程分为2步:

    1)按照官网对中间件类的约定,编写一个中间件类   

    public class MyMiddleware
    {
        private readonly RequestDelegate _next;
    
        public MyMiddleware(RequestDelegate next)
        {
            _next = next;
        }
    
        public async Task InvokeAsync(HttpContext context)
        {
    
            //下一个中间件执行之前需要执行的操作
    
            // Call the next delegate/middleware in the pipeline
            await _next(context);
    
            //下一个中间件执行之后需要执行的操作
    
        }
    }

     2)为IApplicationBuilder添加一个扩张方法,在StartUp.Configure方法中直接进行调用

    public static class IApplicationBuilderExtension
    {
        public static IApplicationBuilder UseMyMiddleware( this IApplicationBuilder builder) 
      {
        return builder.UseMiddleware<MyMiddleware>();
      }
    }

    在StartUp.Configure方法中添加:

    app.UseMyMiddleware();

    这样就完成了一个中间件的编写。

    这里有一个疑问:就是在编写MyMiddleware类的时候,并没有继承接口或抽象类,那么在调用UseMiddleware方法的时候,程序是如何知道需要调用其中的哪个方法呢,猜测只能是通过反射去调用了,但是实际如何就必须去看源码了,以后有时间求证一下。

    2.后台服务

    有时我们想要在网站启动的时候启动某项服务,比如我们想要在启动网站时监听消息队列。

    Asp .Net Core 2.1为我们提供了一个抽象类 BackgroundService,如果我们需要启动一个后台服务,我们只需要两个步骤:

    1)继承BackgroundService,并实现其中的ExecuteAsync方法,在里面编写服务需要进行的操作;

      public class MqService : BackgroundService
      {
            protected override async Task ExecuteAsync(CancellationToken stoppingToken)
            {
                await Task.Run(() =>
                {
                     //编写服务的功能代码
        
                });
            }
        }

    2)在StartUp.ConfigureServices方法中注册该服务

    在ConfigureServices方法中添加如下代码:

    services.AddSingleton<Microsoft.Extensions.Hosting.IHostedService, MqService>();

     这样我们就完成了为网站添加启动服务的功能。

  • 相关阅读:
    MySql常用日期时间查询
    微信开发中网页授权access_token与基础支持的access_token异同
    Sqlserver复杂查询
    Array排序和List排序
    关于java按位操作运算
    验证redis的快照和AOF
    线程安全 加锁机制
    Redis 与 数据库处理数据的两种模式
    redis实现点击量/浏览量
    jsp网站访问次数统计的几种方法
  • 原文地址:https://www.cnblogs.com/gamov/p/10382579.html
Copyright © 2011-2022 走看看