前言

  用户请求接口路由,应用返回处理结果。应用中如何匹配请求的数据呢?为何能如此精确的找到对应的处理方法?今天就谈谈这个路由。路由负责匹配传入的http请求,将这些请求发送到可以执行的终结点。终结点在应用中进行定义并且在应用启动的时候进行配置,也就是在中间件中进行处理。

路由基础知识

  在项目新建的时候都会自动生成路由相关代码。在startup.configure中的中间件管道注册的。主要涉及到的则是userouting和useendpoints中间件。

    userouting向中间件添加路由匹配。此中间件还会查看应用中定义的终结点集。也就是把应用中的路由统统注册到中间件管道,方便请求的时候进行匹配。

    useendpoints向中间件添加终结点执行。会运行相关联的委托。简单将就是路由匹配之后的处理事件运行。

  例如上面的代码就是htpp get 请求并且url是/的时候需要执行的委托、如果这里的请求不是get请求或者不是”/”,那么没有路由匹配,则会返回404。同时指定匹配模式的还有mapdelete、mapmethods、mappost、mapput、map等。

终结点

  上面讲的mapget或者未用到mappost等就是用于定义终结点的。它们都包含有两个参数,一个是用于url匹配的,另外一个就是需要执行的委托。这里在不一样的应用中都采用了不同的终结点定义方法

  • 用于 razor pages 的 maprazorpages
  • 用于控制器的 mapcontrollers
  • 用于 signalr 的 maphub
  • 用于 grpc 的 mapgrpcservice

  那么我们如果需要使用到了授权模块将如何处理呢,终结点也有相对应的处理方式。下面就展示将授权中间件和路由一起使用,maphealthchecks添加运行状况检查终结点。后面跟着的requireauthorization则是将授权策略添加到端点。

  而且我们看中间的使用顺序,useauthentication、useauthorization是穿插在userouting和useendpoints中间的,如此写法则是为了授权策略能在userouting中查找终结点,但是能在useendpoints发送到终结点执行之前应用所选择的授权策略

终结点元数据

  上面的示例展示了运行状况检查终结点附加了授权策略。添加的授权策略是额外数据,也就是终结点元数据。

  • 可以通过路由感知中间件来处理元数据。
  • 元数据可以是任意的 .net 类型。

  上面提到元数据可以是人意的.net类型,那么具体到底是什么呢?元数据如何使用呢?

  看上面的示例中,在终结点绑定”/sensitive”的时候会附加元数据withmetadata。当访问“/”的时候会输出”hello world!”。但是在app.use中并不会执行输出”处理事务逻辑”,因为并没有匹配的元数据。但是当执行”/sensitive”的时候就会输出console.writeline(“开始处理事务逻辑”);。因为在终结点定义的时候添加了元数据。元数据可以是人意.net类型。上面的元数据也是我们自定义class。

比较终端中间件和路由

  上面我们使用app.use来检测匹配元数据,如果匹配成功我们就执行对应的操作。我们称之为终端中间件,为什么是终端中间件呢,因为这里会停止搜索执行匹配和操作、最后返回。

  那么相比较下终端中间件和路由有什么区别呢?

这两种方法都允许终止处理管道:终端中间件允许在管道中的任意位置放置中间件:

  • 中间件通过返回而不是调用 next 来终止管道。
  • 终结点始终是终端。

终端中间件允许在管道中的任意位置放置中间件:

  • 终结点在 useendpoints 位置执行。

终端中间件允许任意代码确定中间件匹配的时间:

  • 自定义路由匹配代码可能比较复杂,且难以正确编写。
  • 路由为典型应用提供了简单的解决方案。
  • 大多数应用不需要自定义路由匹配代码。

带有中间件的终结点接口,如 useauthorization 和 usecors。

  • 通过 useauthorization 或 usecors 使用终端中间件需要与授权系统进行手动交互

设置传统路由

  上面我们知道了通过userouting向中间件添加路由匹配,然后通过useendpoints定义终结点去执行匹配委托。那么在mvc模式中如何设置呢?我们看看传统路由的设置方法。

  上面我们设置传统路由的时候采用的是endpoints.mapcontrollerroute();,其中附带有两个参数,一个是名称default,第二个则是路由模板。我们看路由模板{controller=home}/{action=index}/{id?},那么在匹配url路径的时候,例如执行路径 weatherforecast/index/5。那么则会匹配控制器为weatherforecast,其中方法是index并且参数是int类型的一个处理方法。

rest api 的属性路由

  上面讲的是传统路由设置,那么对于api项目的路由设置是如何的呢?rest api 应使用属性路由将应用功能建模为一组资源。我们看下示例代码

  在上面的代码中使用mapcontrollers调用。映射属性路由。我们看在使用的时候属性路由的使用方式。

route[]

      下面的示例中我们采用的是route[]的方式,它既可单独作用域控制器也可单独作用域action。也可同时使用。

http[verb]

      采用http[verb]的方式那就仅仅能作用在action上了。比如下面的就直接在index上方写[httpget

route[]和http[verb]混合使用

      有时在实际运用中也可以采取两种方式混合使用的,例如下面的示例在控制器采用route[],在action采用http[verb]。因为一般定义api的时候我们不仅要标注action名称,我们还需要知道action的请求方式。

总结

到此这篇关于.net core路由处理的文章就介绍到这了,更多相关.net core路由处理内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!