ASP.NET Core 中间件的几种实现方式

实现接口 

通过实现接口 IMiddleware 编写自定义中间件,这是一种强类型的方式,我们需要必须强制按照接口的定义来实现.

IMiddleware 

接口 IMiddleware 定义如下:

using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Http
{
public interface IMiddleware
    {
Task InvokeAsync(HttpContext context, RequestDelegate next);
    }
}

 

可以看到接口 IMiddleware 的命名空间是 Microsoft.AspNetCore.Http,需要实现的方法是 InvokeAsync(),看起来不算太复杂, 嗯,看起来不算太复杂

嗯,重新开始,我们新建一个空的 ASP.NET Core Web Application

然后我们通过实现接口的方式来自定义一个中间件,代码如下:

// 新建类 MyMiddleware.cs
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace WebApplication1
{
public class MyMiddleware : IMiddleware
    {
public Task InvokeAsync(HttpContext context, RequestDelegate next)
{
throw new NotImplementedException();
        }
    }
}

 

按照上面实现的中间件 MyMiddleware,在执行时应该会抛出 NotImplementedException.

使用接口实现的中间件需要在先在服务容器中注册

// Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
namespace WebApplication1
{
public class Startup
    {
public void ConfigureServices(IServiceCollection services)
{
// 在服务容器中注册自定义中间件
            services.AddSingleton<MyMiddleware>();
        }
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
// 使用 UseMiddleware() 把自定义中间件添加到管道中
            app.UseMiddleware<MyMiddleware>();
            app.Run(async (context) =>
            {
await context.Response.WriteAsync("Hello World!");
            });
        }
    }
}

 

然后 F5 启动,页面上可以看到如下结果:

ASP.NET Core 中间件的几种实现方式

符合我们上面的预期,抛出了一个 NotImplementedException.

然后我们改造下 MyMiddleware 中间件

// MyMiddleware.cs
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
namespace WebApplication1
{
public class MyMiddleware : IMiddleware
    {
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
// 这里不对 request 做任何处理,直接调用下一个中间件
await next(context);
        }
    }
}

 

这里相当于我们实现了一个叫做 MyMiddleware 的中间件,但是并没有对请求进行任何处理,页面上应该正常显示 Hello World! 字符串.

然后我们 F5 启动看看

ASP.NET Core 中间件的几种实现方式

嗯…符合预期.

个人觉得:这种方式最符合面向对象的特性,也符合面向接口的原则,少一些难以理解的魔法,反而有助于理解.

约定方式

 

编程世界有这么一句话,叫”约定大于配置”.

那么编写中间件的约定是什么呢?

重新开始,新建一个空的 ASP.NET Core Web Application

然后新建一个类,类名叫做 MyMiddleware 好了,代码如下:

// MyMiddleware.cs
using Microsoft.AspNetCore.Http;
using System;
using System.Threading.Tasks;
namespace WebApplication1
{
public class MyMiddleware
    {
// 1. 需要实现一个构造函数,参数为 RequestDelegate
public MyMiddleware(RequestDelegate next)
{
        }
// 2. 需要实现一个叫做 InvokeAsync 方法
public async Task InvokeAsync(HttpContext context)
{
throw new NotImplementedException("这是一个按照约定方式编写的中间件,但未实现具体内容");
        }
    }
}

 

约定的内容,就是满足 2 个需要…不满足需要则异常.

然后我们把这个中间件,注册到管道中,以便使用

// Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
namespace WebApplication1
{
public class Startup
    {
public void ConfigureServices(IServiceCollection services)
{
        }
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
// 注册自定义中间件
// 注册顺序=1
            app.UseMiddleware<MyMiddleware>();
            app.Run(async (context) =>
            {
await context.Response.WriteAsync("Hello World!");
            });
        }
    }
}

 

然后 F5 启动,来看看效果

 

ASP.NET Core 中间件的几种实现方式

嗯,符合预期.

然后我们来调整下中间件,让请求能正常响应输出 Hello World!

using Microsoft.AspNetCore.Http;
using System;
using System.Threading.Tasks;

namespace WebApplication1
{
public class MyMiddleware
    {
private readonly RequestDelegate _next;
// 需要实现一个构造函数,参数为 RequestDelegate
public MyMiddleware(RequestDelegate next)
{
            _next = next;
        }
// 需要实现一个叫做 InvokeAsync 方法
public async Task InvokeAsync(HttpContext context)
{
// 不处理任何 request, 直接调用下一个中间件
await _next.Invoke(context);
        }
    }
}

 

然后 F5 启动,看看效果

ASP.NET Core 中间件的几种实现方式

嗯,符合预期.

个人觉得:只能说一句,约定方式是目前用的最多的方式…

写在最后

Tips: 有些内容可能看起来还是不太容易理解,至少当下你是很难理解的,但是套路就在哪里,好比 1+1=2,你知道 1+1 为什么=2 么?但你一定会算会用 1+1=2…


转自:taadis(安仔)
cnblogs.com/taadis/p/12148859.html

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
1 2
图片正在生成中,请稍后...