c# api路由

C#中,API路由通常通过ASP.NET Core框架中的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路由的详细介绍:

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、在控制器中配置

c# api路由

使用[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、自定义约束

c# api路由

可以通过实现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

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

(0)
未希
上一篇 2025-02-15 18:52
下一篇 2025-02-15 18:54

相关推荐

  • c# sqlite读写数据库

    在C#中,使用SQLite进行数据库读写操作通常涉及安装SQLite库、创建连接、执行SQL命令等步骤。

    2025-02-26
    017
  • c 图像识别文字 api

    图像识别文字API是一种通过调用云服务,将图片中的文字信息转化为可编辑文本的技术接口。

    2025-02-26
    012
  • c# 向服务器上传文件

    在C#中,可以使用HttpClient类来向服务器上传文件。以下是一个示例代码:“csharp,using System;,using System.Net.Http;,using System.Threading.Tasks;public class FileUploader,{, public static async Task UploadFileAsync(string filePath, string serverUrl), {, using (var client = new HttpClient()), {, using (var content = new MultipartFormDataContent()), {, var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(filePath));, fileContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse(“multipart/form-data”);, content.Add(fileContent, “file”, Path.GetFileName(filePath)); var response = await client.PostAsync(serverUrl, content);, response.EnsureSuccessStatusCode();, }, }, },},`这个代码定义了一个FileUploader类,其中包含一个静态异步方法UploadFileAsync`,用于将指定路径的文件上传到指定的服务器URL。

    2025-02-26
    017
  • c# 向数据库添加数据

    在C#中,可以使用ADO.NET或Entity Framework等技术向数据库添加数据。

    2025-02-26
    017

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

产品购买 QQ咨询 微信咨询 SEO优化
分享本页
返回顶部
云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购 >>点击进入