首页 > 编程语言 >ASP.NET Core教程-Routing(路由)

ASP.NET Core教程-Routing(路由)

时间:2022-11-21 10:56:16浏览次数:32  
标签:Core ASP UseEndpoints app Routing context endpoints public 路由

更新记录
转载请注明出处:
2022年11月21日 发布。
2022年11月20日 从笔记迁移到博客。

Route Basic(路由基础)

路由说明

请求URL映射到控制器方法的过程,这个映射过程由路由规则定义。

路由功能

跟据预先配置的路由信息对客户端传来的请求进行路由映射,映射完成后再将请求传给对应的模块处理,比如:指定的Controller处理。 ASP.NET Core 提供创建路由及路由处理器的接口,要创建路由,首先要先添加路由中间件,然后配置路由相关的服务。

路由的类型

ASP.NET Core中两种路由

  • 常规路由
  • 特性路由

常规路由特性路由 对比:

  • 特性路由修饰在Controller和Action上,特性路由有更多的灵活性。

  • 常规路由一般用于设置HTML控制器的映射。

  • 特性路由一般用于设置RESTful API控制器的映射。

  • 常规路由和特性路由可以混用。

默认路由规则

在Startup.cs文件中的Startup类中Configure()方法中,可以看到UseMvcWithDefaultRoute()中间件,这是启动默认MVC路由的功能。这会给ASP.NET Core添加默认路由规则。

{controller}/{action}/{id?}
//默认映射规则
// {controller}映射到控制器
// {action}映射到控制器的方法
// {id?}映射到控制器方法的参数,称为模型绑

Configure()方法:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseMvcWithDefaultRoute();
}

如果需要自定义映射规则,可以使用UseEndpoints()中间件来设置端点,然后在端点中设置如何映射

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseMvcWithDefaultRoute();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

Route Middleware(路由中间件)

UseRouting()中间件

使用UseRouting()中间件启用路由功能。然后使用UseEndpoints()中间件配置路由功能。

UseRouting注册了路由中间件,负责根据请求信息匹配路由定义。路由信息定义包含了路由的处理程序信息,这些信息会在UseEndpoints方法中预先注册生成。当一个请求到达时,路由中间件匹配到MvcEndpointInfo后,后续的中间件就可以根据这些信息进行处理。例如,身份认证中间件可以判断Endpoint对应的处理程序是否要求身份认证,进而进行认证操作。当这些中间件处理完毕后,如果请求未被返回,则由EndpointMiddleware直接调用Endpoint对应的处理程序,从而完成整个请求的处理。基于终结点路由的设计,理论上可以定义任意的路由匹配规则和处理程序。

image

实例:

public class Startup
{

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        //启用路由功能
        app.UseRouting();
        ...
        //配置路由端点
        app.UseEndpoints(endpoints =>
        {
            //具体的路由配置项
            endpoints.MapControllers();
        });
    }
}

UseEndpoints()中间件

使用UseRouting()中间件启用路由功能。然后使用UseEndpoints()中间件配置路由功能。路由中间件UseEndpoints()是ASP.NET Core新增功能。
路由中间件UseEndpoints()的核心点是:EndpointRouting(终结点路由)。路由中间件UseEndpoints()会代替原有的路由规则和模板,可以跨越不同中间件系统,所以可以用在MVC、Razor Pages、Blazor、SignalR、gRPC中。推荐使用路由中间件UseEndpoints()来设置路由。

app.UseEndpoints(endpoints =>{
                     //注册Web API Controller
                     endpoints.MapControllers();
                     //注册MVC Controller模板 {controller=Home}/{action=Index}/{id?}
                     endpoints.MapDefaultControllerRoute();
                     //注册RazorPages
                     endpoints.MapRazorPages();
                     //注册Blazor Hub
                     endpoints.MapBlazorHub();
                     //注册SignalR Hub
                     endpoints.MapHub<MySignalHub>();
                     //注册Grpc服务终结点
                     endpoints.MapGrpcService<OrderService>();
                     //注册健康检查
                     endpoints.MapHealthChecks("/ready");
                 });

实例:自定义配置

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            //路由名称
            name: "default",
            //路由规则
            pattern: "{controller=Home}/{action=Index}/{id?}",
		   //默认值(方式二)
        	defaults: new{ controller = "Home", action = "Index" , id = 888 },
        	//路由约束
            constraints: new{ id = new IntRouteConstraint() }
        );
        
        endpoints.MapControllerRoute(
            name: "panda",
            pattern: "{Panda}/{action}/{id?}");
    	});
}

实例:配置默认路由规则

public class Startup
{
    ...
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        //启用路由功能
        app.UseRouting();
        ...
        //配置路由端点
        app.UseEndpoints(endpoints =>
        {
            //配置默认的路由规则
            endpoints.MapControllerRoute("default", "{controller}/{action}/{id?}");
        });
    }
}

Rote Match(路由匹配)

URL 段变量

URL 段变量基本使用

在URL中可以直接使用固定的字符匹配,也称为静态段,也称为路由参数,比如:

/PandaController/PandaAction/PandaArgument

也可以使用称为段变量,使用指定的模式进行匹配

/{first}/{second}/{third}

实例:

app.UseEndpoints(endpoints =>
{
    endpoints.MapGet("{first}/{second}/{third}", async context =>
    {
        await context.Response.WriteAsync("开始-路由信息");
        foreach (var keyValuePair in context.Request.RouteValues)
        {
            await context.Response.WriteAsync($"{keyValuePair.Key}-{keyValuePair.Value}\n");
        }
        await context.Response.WriteAsync("结束-路由信息");
    });
});

URL 段变量设置默认值

在段变量中直接指定默认值即可

{Key=defaultValue}

实例:

app.UseEndpoints(endpoints =>
{
    //设置映射
    endpoints.MapGet("/Panda/{Key=defaultValue}", async context =>
    {
        await context.Response.WriteAsync("Panda666");
    });
});

URL 段变量设置可选段

在段变量中加上?即可。

{Key?}

实例:

app.UseEndpoints(endpoints =>
{
    //设置映射
    endpoints.MapGet("/Panda/{Key?}", async context =>
    {
        await context.Response.WriteAsync("Panda666");
    });
});

默认情况下可选段匹配较短的URL路径。如果需要匹配更多的URL。可以加上catchall段。

app.UseEndpoints(endpoints =>
{
    //设置映射
    endpoints.MapGet("/Panda/{*catchall}", async context =>
    {
        await context.Response.WriteAsync("Panda666");
    });
});

路由约束(Routing constraints)

路由约束说明

路由约可以使用:常规路由的Constraints参数方式、行内简写方式。

常规路由的Constraints参数方式

使用constraints参数即可。配置起来比较麻烦,一般使用行内简写。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            //路由名称
            name: "default",
            //路由规则
            pattern: "{controller=Home}/{action=Index}/{id?}",
		   //默认值(方式二)
        	defaults: new{ controller = "Home", action = "Index" , id = 888 },
        	//路由约束
            constraints: new{ id = new IntRouteConstraint() }
        );
        
        endpoints.MapControllerRoute(
            name: "panda",
            pattern: "{Panda}/{action}/{id?}");
    	});
}

行内简写方式路由匹配约束

应用约束的方式是使用冒号(

标签:Core,ASP,UseEndpoints,app,Routing,context,endpoints,public,路由
From: https://www.cnblogs.com/cqpanda/p/16907942.html

相关文章

  • 常用 ASP.NET Core 十二个例子
    原文地址:http://piotrgankiewicz.com/2017/04/17/asp-net-core-12-samples/作者:PiotrGankiewicz翻译:杨晓东(Savorboard)前言在今天的博客中,我将介绍十几个可以在A......
  • 如何一秒钟从头构建一个 ASP.NET Core 中间件
    前言其实地上本没有路,走的人多了,也便成了路。--鲁迅就像上面鲁迅说的那样,其实在我们开发中间件的过程中,微软并没有制定一些策略或者文档来约束你如何编写一个中间件......
  • ASP.NET Core 中间件之压缩、缓存
    前言今天给大家介绍一下在ASP.NETCore日常开发中用的比较多的两个中间件,它们都是出自于微软的ASP.NET团队,他们分别是Microsoft.AspNetCore.ResponseCompression和......
  • ASP.NET Core 之 Identity 入门(二)
    前言在上篇文章中讲了关于Identity需要了解的单词以及相对应的几个知识点,并且知道了Identity处在整个登入流程中的位置,本篇主要是在.NET整个认证系统中比较重要的......
  • ASP.NET Core 之 Identity 入门(三)
    前言在上一篇文章中,我们学习了CookieAuthentication中间件,本篇的话主要看一下Identity本身。最早2005年ASP.NET2.0的时候开始,Web应用程序在处理身份验证和授权......
  • 我眼中的ASP.NET Core之微服务(一)
    前言前几天在博客园看到有园友在分享关于微软的一个微服务架构的示例程序,想必大家都已经知道了,那就是eShopOnContainers。我们先不看项目的后缀名称OnXXX,因为除了OnC......
  • 我眼中的ASP.NET Core之微服务(二)
    前言接上一篇。上一篇未完待续的原因是当时刚好是6-30号晚上马上12点了还没写完,然后我想赶在7月1号之前发出去,所以当时就发了。然后在发的时候出了一点问题,结果发出去的......
  • .NET Core工作流
    命令#.NETCorev2#Build,test,package,orpublishadotnetapplication,orrunacustomdotnetcommand.-task:DotNetCoreCLI@2inputs:command:'bu......
  • 《ASP.NET Core技术内幕与项目实战》精简集-EFCore2.8:EFCore7的重磅更新-批量操作
    本节内容,为补充内容,部分类型涉及5.1和5.2,P129-P134。主要NuGet包:  一、实体更改跟踪EFCore默认采用“快照更改跟踪”,会对“通过DbContext上下文查询出来的所有实体对......
  • ASP.NET 网站项目 EF 的简单操作例子
    ASP.NET网站项目EF的简单操作例子:操作代码:usingEFTest.Models;usingSystem;usingSystem.Collections.Generic;usingSystem.Data;usingSystem.Linq;usingSy......