C# ASP.NET Core中的路由(Routing)配置 - 从约定到特性的路由

发布时间 - 2025-12-26 00:00:00    点击率:
ASP.NET Core路由分约定式和特性路由两种,前者在Program.cs中全局配置,适用于MVC页面应用,如MapControllerRoute定义{controller=Home}/{action=Index}/{id?};后者通过[Route]等属性在控制器或方法上直接设置,更灵活,适合RESTful API,如[HttpGet("api/[controller]")];可混合使用,MapControllers()启用特性路由,约定路由处理其余请求;支持路由约束如{id:int}、{name:alpha}及可选参数{id?},合理组合避免冲突,现代项目推荐以特性路由为主。

在 ASP.NET Core 中,路由(Routing)是将传入的 HTTP 请求映射到控制器中的具体操作方法的过程。它决定了 URL 如何被解析和处理。ASP.NET Core 提供了两种主要方式来配置路由:约定式路由(Conventional Routing)和特性路由(Attribute Routing)。了解它们的区别和使用场景,有助于构建清晰、可维护的 Web API 或 MVC 应用。

约定式路由(Conventional Routing)

约定式路由是在应用启动时通过全局模式定义的,通常在 Program.csStartup.cs 中配置。它适用于传统的 MVC 模式,强调统一的 URL 结构。

例如,在 Program.cs 中添加如下代码:

builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();

app.UseRouting();

app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");

上述配置表示:

  • 默认访问 /Home/Index
  • URL 格式为:/Controller/Action/Id
  • Id 是可选参数

这种模式适合页面驱动的应用,如后台管理系统,URL 规律性强,易于维护。

特性路由(Attribute Routing)

特性路由通过在控制器或操作方法上使用属性来定义路由,更加灵活,特别适合构建 RESTful 风格的 Web API。

启用特性路由只需在控制器上添加 [Route] 特性:

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
[HttpGet] // GET: api/products
public IActionResult Get() => Ok(new[] { "product1", "product2" });

[HttpGet("{id}")] // GET: api/products/5
public IActionResult GetById(int id) => Ok($"Product {id}");

[HttpPost] // POST: api/products
public IActionResult Create([FromBody] string name) => CreatedAtAction(nameof(GetById), new { id = 1 }, name);
}

关键点:

  • [controller] 自动替换为控制器名称(去掉 Controller 后缀)
  • 支持组合使用类级别和方法级别的路由
  • 可精确控制每个端点的 URL 路径和 HTTP 方法

混合使用约定与特性路由

你可以在同一个项目中同时使用两种方式。MVC 页面用约定路由,API 接口用特性路由。

确保调用 MapControllers() 来启用特性路由:

app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");

app.MapControllers(); // 启用所有使用 [ApiController] 和路由特性的控制器

这样,带特性的控制器会优先按属性路由匹配,其余走默认约定。

路由约束与可选参数

无论是哪种方式,都可以添加约束来限制参数格式:

  • {id:int} —— 只匹配整数
  • {name:alpha} —— 只匹配字母
  • {date:datetime} —— 匹配日期时间
  • {id?} —— 表示参数可选

例如:

[HttpGet("users/{id:int:min(1)}")]
public IActionResult GetUser(int id)
{
// 只接受大于等于1的整数 id
}

基本上就这些。根据项目类型选择合适的路由方式:页面为主的系统可用约定式,API 服务推荐特性路由,现代项目往往以特性路由为主,更直观、可控。不复杂但容易忽略的是顺序和组合使用的方式,合理配置才能避免冲突。


# 路由  # app  # 区别  # restful api  # c#  # .net  # mvc  # restful  # String  # if  # date  # Error  # int  # 接口  # class  # public  # Attribute  # var  # default  # http  # 可选  # 两种  # 适用于  # 操作方法  # 的是  # 是在  # 你可以  # 管理系统  # 只需  # 哪种 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: ,南京靠谱的征婚网站?  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  如何破解联通资金短缺导致的基站建设难题?  如何在IIS中新建站点并配置端口与物理路径?  网站页面设计需要考虑到这些问题  如何解决hover在ie6中的兼容性问题  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  ,怎么在广州志愿者网站注册?  如何撰写建站申请书?关键要点有哪些?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  深圳网站制作平台,深圳市做网站好的公司有哪些?  如何在Windows环境下新建FTP站点并设置权限?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  LinuxShell函数封装方法_脚本复用设计思路【教程】  动图在线制作网站有哪些,滑动动图图集怎么做?  如何快速启动建站代理加盟业务?  如何用AWS免费套餐快速搭建高效网站?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  如何快速查询网站的真实建站时间?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  微信小程序 HTTPS报错整理常见问题及解决方案  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  如何在VPS电脑上快速搭建网站?  javascript中闭包概念与用法深入理解  详解jQuery中基本的动画方法  php结合redis实现高并发下的抢购、秒杀功能的实例  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  如何打造高效商业网站?建站目的决定转化率  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  如何在云主机上快速搭建网站?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  大同网页,大同瑞慈医院官网?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  历史网站制作软件,华为如何找回被删除的网站?  Laravel怎么在Blade中安全地输出原始HTML内容  音乐网站服务器如何优化API响应速度?  企业网站制作这些问题要关注  网站制作报价单模板图片,小松挖机官方网站报价?  怎么用AI帮你设计一套个性化的手机App图标?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧