• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 浅谈ASP.NET Core 中间件详解及项目实战

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

作者:杨晓东 字体:[增加 减小] 来源:互联网 时间:2017-05-11

杨晓东通过本文主要向大家介绍了浅谈,浅谈小学语文阅读教学,浅谈如何转化后进生,浅谈汽车运动,浅谈小学数学教学方法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

前言

本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World。

中间件(Middleware)的作用

我们知道,任何的一个web框架都是把http请求封装成一个管道,每一次的请求都是经过管道的一系列操作,最终到达我们写的代码中。那么中间件就是在应用程序管道中的一个组件,用来拦截请求过程进行一些其他处理和响应。中间件可以有很多个,每一个中间件都可以对管道中的请求进行拦截,它可以决定是否将请求转移给下一个中间件。

asp.net core 提供了IApplicationBuilder接口来让把中间件注册到asp.net的管道请求当中去,中间件是一个典型的AOP应用。
每一个中间件都都可以在请求之前和之后进行操作。请求处理完成之后传递给下一个请求。

中间件的运行方式

默认情况下,中间件的执行顺序根据Startup.cs文件中,在public void Configure(IApplicationBuilder app){} 方法中注册的先后顺序执行。

大概有3种方式可以在管道中注册"中间件"

1.app.Use(),IApplicationBuilder接口原生提供,注册等都用它。

2.app.Run() ,是一个扩展方法,它需要一个RequestDelegate委托,里面包含了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利器,过滤器更贴合业务,它关注于应用程序本身,比如你看ActionFilter 和 ResultFilter,它都直接和你的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?}");
  });
}
</div>

懒得去下载源码了,我们使用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>());
  }
}

</div>

可以看到 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.");
  }
}

</div>

了解了上面的约定之后,我们就开始定义我们自己的中间件Class。

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

平台有一个要求就是,用户在我们子系统退出之后,要调用平台的一个接口通知他们,他们要做一些后续的业务。

OK,开始撸码。

  • 首先创建一个PlatformAuthoricationMiddleware,它继承于Microsoft.AspNetCore.Authentication下的类AuthenticationMiddleware,由于AuthenticationMiddleware已经实现了Invoke功能,所以我们只需要重写(override)它里面的一些方法就可以了。等等,我们好像还需要一些配置,比如流程图中的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.在Pl

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 浅谈ASP.NET常用数据绑定控件优劣总结
  • 浅谈如何在ASP.NET Core中实现一个基础的身份认证
  • 浅谈ASP.NET Core 中间件详解及项目实战
  • 浅谈ASP.NET中多层架构
  • 浅谈ASP.NET中MVC 4 的JS/CSS打包压缩功能
  • 浅谈ASP.NET中最简单的自定义控件
  • 浅谈c#设计模式之单一原则
  • 浅谈.net平台下深拷贝和浅拷贝
  • 浅谈.Net并行计算之数据并行
  • ASP.NET学习路线图浅谈

相关文章

  • 2017-05-11ASP.NET过滤HTML字符串方法总结
  • 2017-05-11ASP.Net页尾中添加JavaScript的最佳方法实战分享
  • 2017-05-11c#对xml的简单操作
  • 2017-05-11ASP.NET程序中用Repeater实现分页
  • 2017-05-11总结Visual Studio下ASP.NET模板化控件中的数据绑定
  • 2017-05-11ASP.NET中事件如何依次发生?
  • 2017-05-11ASP.NET中制作各种3D图表的方法
  • 2017-05-11灵活掌握asp.net中gridview控件的多种使用方法(下)
  • 2017-05-11用DataReader还是DataSet?
  • 2017-05-11获取创建Membership的数据库创建脚本

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • .net开发:为程式码加上行号的方法详解
    • ASP.NET 用户控件的使用介绍
    • asp.net使用ashx生成图形验证码的方法示例
    • Asp.net XMLHTTP封装类(GET,Post发送和接收数据)
    • 解析利用wsdl.exe生成webservice代理类的详解
    • 将选择的图片显示在listview中,并显示filename,path和type的简单实例
    • asp.net微信开发(高级群发图文)
    • 在ASP.NET 2.0中操作数据之三十八:处理BLL和DAL的异常
    • asp.net下gridview 批量删除的实现方法第1/3页
    • ASP.NET中常用的用来输出JS脚本的类

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有