Route
属性或使用MapControllerRoute
方法来定义。“csharp,[ApiController],[Route("api/[controller]")],public class SampleController : ControllerBase,{, [HttpGet("{id}")], public IActionResult Get(int id), {, return Ok($"Received ID: {id}");, },},
“这段代码定义了一个基本的API控制器,其中包含一个GET请求的路由。在C#中,API路由是构建Web应用程序和服务的关键部分,它定义了如何将HTTP请求映射到相应的控制器和操作方法上,以下是关于C# API路由的详细介绍:
一、基本概念
1、路由定义
路由模板:使用[Route]
属性或在Startup.cs
(ASP.NET Core)/Global.asax
(ASP.NET MVC)中配置路由模板,如"api/{controller}/{action}/{id?}"
,其中{controller}
表示控制器名称,{action}
表示操作方法,{id?}
表示可选的ID参数。
HTTP方法:通过[HttpGet]
、[HttpPost]
、[HttpPut]
、[HttpDelete]
等属性限制路由对应的HTTP请求方法。
2、路由选择
默认路由:如果没有指定路由模板,系统会使用默认路由规则进行匹配,通常为"{controller}/{action}/{id?}"
。
命名路由:可以为路由指定名称,以便在代码中更方便地引用和生成URL,例如[Route("api/[controller]/[action]", Name = "MyRoute")]
。
3、路由参数
路径参数:在路由模板中使用大括号{}
括起来的参数,如{id}
,系统会自动从URL中提取对应的值并传递给操作方法的参数。
查询参数:在URL中以键值对的形式出现在问号?
后面的参数,如?name=John&age=30
,可以通过[FromQuery]
属性将查询参数绑定到操作方法的参数上。
二、路由配置
1、在控制器中配置
使用[Route]
属性在控制器类或操作方法上设置路由模板,
[Route("api/[controller]")] public class UsersController : ControllerBase { [HttpGet("{id}")] public ActionResult<User> GetUser(int id) { // 获取用户信息的逻辑 return Ok(new User { Id = id, Name = "John Doe" }); } }
上述代码中,控制器级别的[Route("api/[controller]")]
属性设置了基础路由模板,操作方法上的[HttpGet("{id}")]
进一步指定了GET请求的路由,其中{id}
为路径参数。
2、在Startup.cs中配置(ASP.NET Core)
在Configure
方法中使用app.UseMvc()
或app.UseEndpoints()
方法配置路由,
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "api/{controller}/{action}/{id?}"); }); }
上述代码配置了一个默认的路由规则,将所有以/api/
开头的请求映射到相应的控制器和操作方法上。
三、路由约束
1、约束类型
字符串约束:使用正则表达式限制参数的值必须符合特定的字符串模式,例如[Route("api/users/{userId:regex(^[a-zA-Z0-9]+$)}")]
。
长度约束:指定参数的长度范围,如[Route("api/products/{id:length(1,5)}")]
表示ID参数的长度必须在1到5之间。
数值范围约束:限制参数的取值范围,如[Route("api/orders/{orderId:min(1)}")]
表示订单ID必须大于等于1。
2、自定义约束
可以通过实现IRouteConstraint
接口创建自定义的路由约束,
public class MustBeAdminConstraint : IRouteConstraint { public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { // 判断当前用户是否为管理员的逻辑 return httpContext.User.IsInRole("Admin"); } }
然后在使用路由模板时应用该约束,如[Route("admin/{action}", Order = 1, Constraint = new MustBeAdminConstraint())]
。
四、路由优先级
1、顺序优先:在配置多个路由规则时,按照配置的顺序进行匹配,先匹配到的路由将被选中执行,更具体的路由应该排在前面,以避免被更通用的路由覆盖。
先配置"api/users/{id}"
,再配置"api/users"
,这样当请求/api/users/123
时,会匹配到前者而不是后者。
2、命名路由优先:如果存在命名路由和其他普通路由都可能匹配的情况,命名路由具有更高的优先级。
五、路由调试
1、日志记录:可以在应用程序中添加日志记录功能,记录每个请求的路由信息,包括请求的URL、匹配的路由模板、控制器和操作方法等,以便在出现问题时进行排查。
在中间件或过滤器中记录日志:
public async Task InvokeAsync(HttpContext context) { var routeData = context.GetRouteData(); string routeTemplate = routeData?.Routers.OfType<Route>().FirstOrDefault()?.RouteTemplate; // 记录日志的逻辑 await _next(context); }
2、路由调试工具:一些开发工具和IDE提供了路由调试的功能,可以直观地查看应用程序的路由配置和匹配情况,帮助开发人员快速定位问题。
C#中的API路由是一个灵活且强大的机制,它允许开发人员精确地控制HTTP请求如何映射到服务器端的操作上,通过合理地配置和使用路由,可以构建出结构清晰、易于维护和扩展的Web应用程序和服务,无论是简单的CRUD操作还是复杂的业务逻辑处理,良好的路由设计都是确保应用程序高效运行的关键之一。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1569510.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复