在ASP.NET MVC和Web API中,路由是决定请求的URL如何映射到控制器动作的关键机制,通过良好的路由设计,可以实现清晰、易维护且用户友好的URL结构,以下是对ASP.NET MVC API路由的详细解析:

一、ASP.NET MVC中的路由
1. 默认路由设置与约定
在ASP.NET MVC中,默认路由起着至关重要的作用,它定义了URL请求如何映射到控制器和动作,理解默认路由的结构和工作原理对于开发人员来说至关重要。
默认路由的结构:通常在RouteConfig.cs文件中进行配置,结构如下:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
参数解析:
name代表路由名称;
url代表路由模板,可以在上面直接赋默认值;
defaults代表路由默认值;
constraints代表路由约束。
2. 自定义路由的实现
在实际开发中,经常会遇到需要处理特殊URL结构的情况,这时就需要创建自定义路由。
需求和重要性:自定义路由能够满足特定的URL映射需求,提升用户体验和SEO优化。
定义和注册:通过RouteCollection.MapRoute()方法定义自定义路由规则,并将其添加到RouteTable.Routes***中进行注册。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "CustomRoute",
url: "articles/{year}/{month}/{title}",
defaults: new { controller = "Blog", action = "Article", year = UrlParameter.Optional, month = UrlParameter.Optional, title = UrlParameter.Optional }
);
}
3. 属性路由
属性路由提供了一种更灵活的方式来定义路由,可以直接在控制器或动作上使用特性来指定路由。
控制器级别的属性路由:使用[Route]特性在控制器类上定义路由前缀。
[Route("Home2/{action}")]
public class HomeController : Controller
{
public string Test1() { return "ok1"; }
}
动作级别的属性路由:使用[HttpGet]或[HttpPost]等HTTP方法特性结合[Route]来定义特定动作的路由。
[HttpGet("{controller}/Test22")]
public string Test2() { return "ok2"; }
4. 多个属性路由的合并规则

属性路由可以同时作用于控制器和动作,匹配规则是“叠加”。
[Route("Home1/{action}")]
public class HomeController : Controller
{
[Route("Test3")]
public string Test3() { return "ok3"; }
}
可以访问路径:https://localhost:44333/Home1/Test3
二、ASP.NET Web API中的路由
1. 默认路由设置与约定
在ASP.NET Web API中,默认路由同样重要,它决定了API请求的URL如何映射到控制器和动作。
默认路由的结构:通常在WebApiConfig.cs文件中进行配置,结构如下:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
参数解析:与MVC相似,但适用于API请求。
2. 自定义路由的实现
与MVC类似,Web API也支持自定义路由以满足特定需求。
需求和重要性:自定义路由能够处理复杂的API请求路径,提升API的灵活性和可维护性。
定义和注册:通过config.Routes.MapHttpRoute()方法定义自定义路由规则。
config.Routes.MapHttpRoute(
name: "CustomApiRoute",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: null,
handler: route =>
{
route.DataTokens = new RouteData();
route.DataTokens["area"] = "NewArea"; // Consistent with RC area routing
return new HttpControllerDispatcher(config);
}
);
3. 属性路由
Web API同样支持属性路由,用于简化路由定义。
控制器级别的属性路由:使用[RoutePrefix]特性在控制器类上定义路由前缀。
[RoutePrefix("api/Home2")]
public class HomeController : ApiController
{
// Action methods here
}
动作级别的属性路由:使用[HttpGet]、[HttpPost]等HTTP方法特性结合[Route]来定义特定动作的路由。
[HttpGet("{controller}/Test22")]
public string Test2() { return "ok2"; }
三、单元表格对比MVC和Web API的路由差异
四、相关问题与解答
问题1:如何在ASP.NET MVC中实现自定义路由?
答:在ASP.NET MVC中,可以通过RouteCollection.MapRoute()方法定义自定义路由规则,并将其添加到RouteTable.Routes***中进行注册。
routes.MapRoute(
name: "CustomRoute",
url: "articles/{year}/{month}/{title}",
defaults: new { controller = "Blog", action = "Article", year = UrlParameter.Optional, month = UrlParameter.Optional, title = UrlParameter.Optional }
);
这样,当访问类似/articles/2024/05/my-article的URL时,将会映射到BlogController的Article动作,并传递相应的参数。
问题2:ASP.NET Web API中的默认路由是如何工作的?
答:在ASP.NET Web API中,默认路由通过解析HTTP请求的类型来匹配动作,默认路由规则通常在WebApiConfig.cs文件中定义,如下:
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
这意味着,当访问/api/Pleasure时,将匹配PleasureController下的HTTP GET动作(通常是Get方法),如果URL中包含id参数(如/api/Pleasure/1),则该参数将被传递给动作方法。
以上就是关于“asp.net mvc api路由”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
