更新记录
转载请注明出处:
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对应的处理程序,从而完成整个请求的处理。基于终结点路由的设计,理论上可以定义任意的路由匹配规则和处理程序。
实例:
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