.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();
});
}
这里路由使用一对中间件,由UseRouting和UseEndpoints注册:
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 路由的主要内容,如果未能解决你的问题,请参考以下文章