.Net Core Mvc 路由

Posted 苏克主任

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.Net Core Mvc 路由相关的知识,希望对你有一定的参考价值。

在中,我们介绍了.net core mvc几个重要的服务,花一篇文章介绍也是有必要的,当我们配置好相应的MVC服务时,下一件事是将MVC中间件注册到应用程序的管道中,以便MVC框架可以处理请求并返回相应的内容(视图和JSON),而在使用MVC中间件时,是要使用到这些服务的。

在MVC框架中,每一个模块的重点放在各自特定的功能,为了使这些功能能正常工作,我们需要将HTTP请求发送到正确的控制器上,我们将这个过程称为路由。今天我们来看下MVC的中间件——路由。

在那一篇,我们展示了Startup类完整配置Mvc的代码。我们再来看下代码:

using Microsoft.AspNetCore.Builder;using Microsoft.Extensions.DependencyInjection;
namespace FirstWebApp{ public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddMvc(options=> { options.EnableEndpointRouting = false; }); }
public void Configure(IApplicationBuilder app) { app.UseMvcWithDefaultRoute(); } }}

代码非常简洁明了,没有其它配置。我们把目光放在Configure方法内部,这里使用了UseMvcWithDefaultRoute方法,这为我们提供了一个默认的路由规则是:{controller=Home}/{action=Index}/{id?}。当浏览器请求http://站点域名/或者http://站点域名/Home/Index时,它会匹配到HomeController类和Index方法获取响应。这也好理解,路由本来的目的是描述ASP.NET Core MVC用于处理HTTP请求并找到可以响应该请求的控制器的规则。.Net Core除了提供默认方式外,还提供了另外几种方式的配置。接下来我们一起看下他们的使用方法。

1、UseMvc

我们继续使用MVC入门的应用程序,将Configure方法内的UseMvcWithDefaultRoute方法改为UseMvc,这里UseMvc的作用是初始化一个新的RouteBuilder,并将处理程序的默认配置注册到MvcRouteHandler。而MvcRouteHandler构造函数中一些依赖项也会被初始化。此时,UseMvc并没有配置相应的路由规则。当我们启动项目会直接报404。为了顺利运行,我们在UseMvc方法传入Action<IRouteBuilder>参数,这也是UseMvc唯一的参数。我们来看下它的代码。

public void Configure(IApplicationBuilder app){ app.UseMvc(routes=>routes.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}"));}

这个跟UseMvcWithDefaultRoute方法的路由规则是一样的。除了上面这种配置方式,我们还可以这样声明,代码如下 :

routes.MapRoute( name: "default_route", template: "{controller}/{action}/{id?}", defaults: new { controller = "Home", action = "Index" });

这两种都是比较常用。一旦配置了默认路由规则,我们还希望能通过基于特定需求添加自定义路由来扩展它。为此,我们可以使用MapRoute新增一条路由规则,如下代码:

public void Configure(IApplicationBuilder app){ app.UseMvc(routes =>    { routes.MapRoute( name: "About", template: "about", defaults: new { controller = "Home", action = "About" });
routes.MapRoute( name: "Default", template: "{controller=Home}/{action=Index}/{id?}"              );    });}

这样我们就额外添加了一条路由,该路由授予对Home控制器上的About操作的访问权/about。因为默认模式路由仍然存在,所以我们也可以使用常规/home/about路由访问“about”页面。

UseMvc作为一般的网站程序基本上能满足,如果要是想在进入路由规则后到控制器之间做操作,只能在UseMvc之前通过HttpContext自定义一些中间件来完成,但你要想获取路由值是行不通的。所以在3.0版本以上引入UseRouting和UseEndpoints结合使用。

2、UseEndpoints

UseEndPoints使用上必须在UseRouting方法之后,否则会报错。而UseEndPoints在模板配置上是没什么变化的,我们先来看下它的代码配置:

public void Configure(IApplicationBuilder app){ app.UseRouting();
app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); });}

这里路由使用一对中间件,由UseRoutingUseEndpoints注册:

  • UseRouting向中间件管道添加路由匹配。此中间件会查看应用中定义的终结点集,并根据请求选择最佳匹配。UseRouting中间件必须在其它中间件之前,如身份验证,授权或者使用路由值的自定义中间件。UseRouting中间件使用路由值和最终节点元数据替代当前的HttpContext,在3.0前的版本是没有这个功能。

  • UseEndpoints向中间件管道添加终结点执行。它会运行与所选终结点关联的委托。即执行匹配的节点映射到控制器上。

MapDefaultControllerRoute方法与UseMvcWithDefaultRoutes方法是一样的功能,当然我们也可以使用自定义模板来配置,具体代码如下:

app.UseEndpoints(endpoints =>{ endpoints.MapControllerRoute( name: "Default", pattern: "{controller}/{action}/{id?}", defaults: new { controller = "Home", action = "Index" } );});

如果有多个只要再新增一个endpoints就可以。

为什么在3.0引入Endpoint routing新概念?我们来对比下两张图:

上面张图是使用UseMvc

这张是使用UseRouting和UseEndpoints

从这两张图对比来看,节点路由使ASP.NET Core框架更加灵活,因为它使路由匹配和解析功能与节点分派功能脱钩,而该功能一直与MVC中间件捆绑在一起。在3.0以上版本更推荐使用UseRouting和UseEndpoints来配置。

关于路由的信息还有很多,比如:复杂模板配置、路由约束(正则表达式)、及通过属性来配置路由。而且官方文档(http://dwz.date/d4MJ)都有介绍,我们在学习的过程要结合官方文档。

本篇关于路由的介绍就到这,这里也没有深入的去剖析怎么解析路由,只是介绍一些简单的用法,但在项目中是够用。随着自己使用中的积累,结合github上的源代码慢慢去挖掘底层的逻辑也能剖析。

最后,祝学习愉快!


以上是关于.Net Core Mvc 路由的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core Mvc 路由

Asp.Net Core MVC - 路由问题

[十] ASP.NET Core MVC 中的路由

asp.net core 系列 5 MVC框架路由(上)

NET CORE MVC - 如何使用嵌套的多参数路由

ASP.NET Core MVC 混合路由/FromBody 模型绑定和验证