>

ASP.NET Core 中间件详解及项目实战

- 编辑:云顶集团登录 -

ASP.NET Core 中间件详解及项目实战


前言

在上篇小说重要介绍了DotNetCore项目处境,本篇小说是大家在开拓协和的项目中实际上接受的,相比贴合实际选择,算是对中间件的二个中肯应用了,不是大约的Hello World,假如您以为本篇随笔对您有效的话,不妨点个【推荐】。

目录

  • ASP.NET Core 中间件详解及项目实战。中间件(Middleware)的作用
  • 中间件的运作情势
  • 中间件(Middleware)和过滤器(Filter)的差距
  • 哪些状态大家须求中间件
  • 怎么自定义本人的中间件

中间件(Middleware)的作用

咱俩知晓,任何的三个web框架都以把http需要封装成三个管道,每壹遍的倡议都是经过管道的一文山会海操作,最后达到大家写的代码中。那么中间件正是在应用程序管道中的三个零器件,用来阻止需要进度举香港行政局地别的管理和响应。中间件能够有不菲个,每壹在那之中间件都能够对管道中的央浼进行拦截,它能够调节是还是不是将央浼改造给下多此中间件。

asp.net core 提供了IApplicationBuilder接口来让把中间件注册到asp.net的管道供给当中去,中间件是多个一级的AOP应用。 上面是三个微软官方的叁当中间件管道央浼图:

图片 1

能够看出,每叁当中间件都都能够在央浼以前和后来进展操作。央求管理完了以往传递给下二个伸手。

ASP.NET Core 中间件详解及项目实战。中间件的运营情势

暗许意况下,中间件的试行顺序依照Startup.cs文件中,在public void Configure(IApplicationBuilder app){} 方法中注册的前后相继顺序实行。
大概有3种艺术能够在管道中登记"中间件"

  1. app.Use()ASP.NET Core 中间件详解及项目实战。,IApplicationBuilder接口原生提供,注册等都用它。
  2. app.Run() ,是一个增加方法,它要求贰个RequestDelegateASP.NET Core 中间件详解及项目实战。信托,里面含有了Http的上下文音讯,没有next参数,因为它连接在管道最后一步试行。
  3. app.Map(),也是多个扩大方法,雷同于MVC的路由,用处常常是有的破例央浼路线的拍卖。如:www.example.com/token 等。

地点的Run,Map内部也是调用的Use,算是对IApplicationBuilder接口扩张,如果您感觉名字都相当不够标准,那么上边这一个扩大方法便是正宗的挂号中间件的了,也是作用最有力的。
app.UseMiddleware<>(),对的,便是其一了。 为啥说作用壮大呢?是因为它不光提供了登记中间件的成效,还提供了依据注入(DI)的功用,今后半数以上情景就用它了。

中间件(Middleware)和过滤器(Filter)的界别

深谙MVC框架的同窗应该知道,MVC也提供了5大过滤器供我们用来拍卖乞请前后供给施行的代码。分别是AuthenticationFilter,AuthorizationFilter,ActionFilter,ExceptionFilter,ResultFilter

依照描述,能够观看中间件和过滤器的功效周边,那么他们有何样分别?为啥又要搞一个中间件呢?
骨子里,过滤器和中间件他们的关心点是不均等的,也正是说职分不均等,干的工作就不相通。

举个栗子,中间件疑似埃辛诺斯战刃,过滤器疑似巨龙之怒,泰蕾苟萨的寄魂杖 ,你叁个总董事长拿着巨龙之怒,泰蕾苟萨的寄魂杖去战地杀人,尽管皆有损害,可是你拿着法杖加害低不说,还减属性啊。

同作为七个AOP利器,过滤器更贴合业务,它关心于应用程序自个儿,比方您看ActionFilterResultFilter,它都一直和您的Action,ActionResult交互作用了,是或不是离你相当近的痛感,那笔者有大器晚成对诸如对自个儿的输出结果实行格式化啦,对自作者的央求的ViewModel进行数据证实啦,确定正是用Filter无疑了。它是MVC的一有的,它能够阻止到您Action上下文的片段新闻,而中间件是从未有过那么些力量的。

怎么状态我们要求中间件

这正是说,几时使用中间件呢?小编的明亮是在咱们的应用程序当中和事情关系十分的小的一些亟需在管道中做的事体能够使用,举例身份验证,Session存款和储蓄,日志记录等。其实我们的 asp.net core项目中自己已经包括了重重此中间件。

举个例子来讲,大家在新建三个 asp.net core应用程序的时候,默许生成的沙盘模拟经营在那之中

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
    app.UseDeveloperExceptionPage();

    app.UseStaticFiles();

    loggerFactory.AddConsole();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

懒得去下载源码了,大家利用Reflector去查看源码:

//扩展方法`app.UseDeveloperExceptionPage();`
public static class DeveloperExceptionPageExtensions
{
    // Methods
    public static IApplicationBuilder UseDeveloperExceptionPage(this IApplicationBuilder app)
    {
        if (app == null)
        {
            throw new ArgumentNullException("app");
        }
        return UseMiddlewareExtensions.UseMiddleware<DeveloperExceptionPageMiddleware>(app, Array.Empty<object>());
    }
}

//扩展方法`app.UseStaticFiles();`
public static class StaticFileExtensions
{
   // Methods
   public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder app)
    {
        if (app == null)
        {
            throw new ArgumentNullException("app");
        }
        return UseMiddlewareExtensions.UseMiddleware<StaticFileMiddleware>(app, Array.Empty<object>());
    }
}

能够看看 app.UseDeveloperExceptionPage()app.UseStaticFiles()等等都以通过中间件实现的。

如何自定义自个儿的中间件

背景:我们项目采纳到中间件的现象是,供给和别的单位扩充客商(User卡塔尔音信的分享。 以平台和子系统譬如,大家正在开荒三个子类别,此中顾客音讯,登陆,注册等成效是坐落于阳台上的,那是多个跨多语言的种类,平台是Java语言开拓,顾客在访问子系统的部分页面包车型地铁时候需求证实是还是不是登入,其余一些页面是不需求验证是还是不是登陆的,所以须求多个身份验证系统来代替Identity的职能。

幸亏的是微软曾经给我们提供了黄金时代套身份验证的中间件,在Microsoft.AspNetCore.Authentication取名空间下,我们只供给实行,增多自个儿的法力就能够了 。具体如何是好啊?直接看代码吧。

基于蔚然成风,中间件类需求有一个Invoke方法,具名是public async Task Invoke(HttpContext context){},上面是叁当中间件的示例类:

public class RequestLoggerMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger _logger;

    public RequestLoggerMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
    {
        _next = next;
        _logger = loggerFactory.CreateLogger<RequestLoggerMiddleware>();
    }

    public async Task Invoke(HttpContext context)
    {
        _logger.LogInformation("Handling request: " + context.Request.Path);
        await _next.Invoke(context);
        _logger.LogInformation("Finished handling request.");
    }
}

打听了上边的预定之后,大家就从头定义咱们和煦的中间件Class。

我们须要一个流程图来清理逻辑思路,以便于写代码的时候思路更加的一目通晓。

图片 2

阳台有叁个渴求正是,客商在大家子系统退出之后,要调用平台的多少个接口公告他们,他们要做一些世袭的事情。

OK,起首撸码。

  • 第黄金时代创立一个PlatformAuthoricationMiddleware,它继续于Microsoft.AspNetCore.Authentication下的类AuthenticationMiddleware,由于AuthenticationMiddleware曾经完结了Invoke成效,所以我们只供给重写(override卡塔尔(英语:State of Qatar)它里面包车型客车有些方式就可以了。等等,大家好像还索要一些布局,比如流程图中的ReturnUrl,平台的Cookie的Key值,平台验证顾客合法性的接口地址等参数。
  • 建构一个Options类举办布局的装置,我们取名称叫:PlatformAuthenticationOptions,继承AuthenticationOptions,况兼完成掉IOptions<T>接口,那样子就会在Startup中央直属机关接配置了。
  • 大家只须求重写AuthenticationMiddleware中的CreateHandler情势就能够了,在Handler中得以实现掉大家中间件的职能。
  • 然后创造二个拍卖的Handler类,取名叫PlatformAuthenticationHandler,继承于AuthenticationHandler<TOptions>用来管理供给中的调用。

于今,大家的主干须要的类已经创设完了,剩下的就是填写代码。

  1. PlatformAuthenticationHandler中重写HandleAuthenticateAsync()方法 , 进行主流程的主宰。
  2. PlatformAuthenticationHandler中重写FinishResponseAsync()主意,进行Session的贮存操作。
  3. PlatformAuthenticationHandler中重写HandleSignOutAsync()形式,进行登出的调节,因为客商登出之后大家要通报平台做一些任何操作。
  4. PlatformAuthenticationHandler中重写HandleUnauthorizedAsync()艺术,进行未表达操作。

终极,大家必要一个扩展类来把我们的中间件以恢宏方法注册到管道当中去 。

public static class MiddlewareExtensions
{
    public static IApplicationBuilder UsePlatformAuthentication(this IApplicationBuilder app) {
        if (app == null) {
            throw new ArgumentNullException(nameof(app));
        }

        return app.UseMiddleware<PlatformAuthenticationMiddleware>();
    }

    public static IApplicationBuilder UsePlatformAuthentication(this IApplicationBuilder app, CookieAuthenticationOptions options) {
        if (app == null) {
            throw new ArgumentNullException(nameof(app));
        }
        if (options == null) {
            throw new ArgumentNullException(nameof(options));
        }

        return app.UseMiddleware<PlatformAuthenticationMiddleware>(Options.Create(options));
    }
}

Startup中就是app.UsePlatformAuthentication()

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));

    //注册PlatformAuthentication中间件
    app.UsePlatformAuthentication(new PlatformAuthenticationOptions() {
        UserSessionStore = new UserSessionStore(),
    });

    app.UseMvc();
}

现行反革命,我们的中间件宗旨业务流程的实现已经出来了,作者就非常小篇幅的黏连代码了,会耳熏目染阅读,感兴趣具体落实的朋友能够去上面包车型大巴地方查看代码,有实际流程的笺注。

演示源码:


本文地址:
作者博客:Savorboard
迎接转发,请保留出处

本文由光剑战士发布,转载请注明来源:ASP.NET Core 中间件详解及项目实战