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>();

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

转载于:https://www.cnblogs.com/gamov/p/10382579.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值