通用技术 简单介绍下 ASP.NET Core 中的中间件

SinDynasty · 2018年02月09日 · 850 次阅读

ASP.NET Core 中的中间件

在 ASP.NET Core 中,中间件的本质是一个 Func的委托,其中 RequestDelegate 的本身也是一个委托,其定义是 public delegate Task RequestDelegate(HttpContext Context);

每一个中间件 Func的传入参数 RequestDelegate 是下一个中间件的返回值,同时每一个中间件 Func的返回值是前一个中间件的传入参数。这样就构成了一串中间件链表,每当一个请求过来,都会按照中间件的注册顺序依次执行 RequestDelegate 中的内容,这就构成了 ASP.NET Core 中的请求管道

中间件类型

虽然中间件的最终提醒的是一个 Func委托对象,但是我们在自定义中间件的过程中,可以将其自定义为一个单独的类型。

public class Middleware
{
    public Middleware(RequestDelegate NextRequestDelegate)
    {
        this.NextRequestDelegate = NextRequestDelegate;
    }//Middleware(RequestDelegate NextRequestDelegate)

    public RequestDelegate NextRequestDelegate { get; }

    public Task Invoke(HttpContext Context)
    {
        Console.WriteLine("Hello World");
        return NextRequestDelegate.Invoke(Context);
    }//Task Invoke(HttpContext Context)

}//class Middleware

首先我们先定义一个类 Middleware 作为一个中间件,然后在其构造函数中传入下一个 RequestDelegate NextRequestDelegate,并将传入的 RequestDelegate 作为一个属性或字段保存起来。备注:该中间件类型的构造函数中可以添加其他已经注册过的 Service 作为传入参数

之后我们在添加一个名为 Invoke 的方法,其传入的参数需要带有一个 HttpContext。在 Invoke 方法中,我们可以编写该中间件所需要执行的方法,在最后将 HttpContext Context 带入之前通过构造函数传入的 RequestDelegate NextRequestDelegate 中,从而获得该方法所需返回的 Task 值,并返回

注册中间件

public class Startup
{
    public void Configure(IApplicationBuilder ApplicationBuilder, IHostingEnvironment HostingEnvironment)
    {
        ApplicationBuilder.UseMiddleware<Middleware>();
    }//void Configure(IApplicationBuilder ApplicationBuilder, IHostingEnvironment HostingEnvironment)

}//class Startup

ASP.NET Core 中,中间件的注册是在 Startup 类的 Configure 方法中进行的。我们可以通过 ApplicationBuilder.UseMiddleware(params object[] Args) 完成注册,其中 Args 指创建这个中间件类中所需带入的未注册 Service 的参数数组

在中间件类型中提取已经注册过的 Service

假设我们已经注册了一个名为 Service 的类,若我们需要在中间件所执行的 Invoke 方法中提取出这个类,我们可以这样写:

public Task Invoke(HttpContext Context)
{
    Context.RequestServices.GetService<Service>();
    return NextRequestDelegate.Invoke(Context);
}//Task Invoke(HttpContext Context)

我们知道委托 RequestDelegate 是这样定义的 public delegate Task RequestDelegate(HttpContext Context),其中传入参数 HttpContext Context 是一个 HttpContext,而在 HttpContext 类中 RequestServices 属性是一个 IServiceProvider 接口,因此我们就可以通过 IServiceProvider 接口的 GetService 方法来提取已经注册过的 Service

题外:在微软的 ASP.NET Core MVC 框架中,其 Controller 的创建最终就是通过 HttpContext 中的 RequestServices 属性来提取出来的,从而完成创建的,当然在提取前,MVC 框架中也进行了相当多的处理,具体的就不说了

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册