在.NET 6.0中自定义接口路由

news2025/2/9 9:14:14

在本文中,我们将讨论ASP.NET Core中的新路由。我们将了解什么是接口(endpoints)路由,它是如何工作的,它在哪里使用,以及如何创建自己的路由。

本文主题:

  • 探索接口路由
  • 创建自定义接口
  • 创建更复杂的接口

名词定义:端点,即我们访问的接口或者叫API,有些地方叫EndPoint或者叫接口,其实源头的称呼应该叫端点会更贴切一些。或者你也可以直接叫EndPoint,但是先不管那么多,大概了解这个意思就可以了。

探索接口路由

要了解接口路由(End Point),您需要了解什么是端点以及什么是路由。

端点是应用程序的一部分,当路由将传入的请求映射到它时,端点就会被执行。

客户端通常从服务器请求资源。大多数情况下,客户端是一个浏览器。资源由指向特定目标的URL定义。除了网页,它也可以是一个移动应用程序,从Web API请求特定JSON数据。

另一方面,执行的端点被映射到一个特定的路由,ASP.NET Core开发人员已经熟悉这样一种路由模式:

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

如果路由或路由模式与传入请求的URL匹配,则请求将映射到该端点。
ASP.NET Core可以映射到以下端点:

  • Controllers (例如, MVC or web APIs)
  • Razor Pages
  • SignalR (and Blazor Server)
  • gRPC services
  • Health checks
    大多数端点都有非常简单的路由模式。只有MVC和Web API端点使用更复杂的模式。Razor页面的路由定义基于实际页面的文件夹和文件结构。

在ASP.NET Core 2.2中引入端点之前,路由只是运用在MVC和Web API中。Razor Pages中的隐式路由是内置的,SignalR没有路由一说。Blazor和gRPC在当时还不不知道在哪儿,健康检查最初是作为中间件组件实现的。

引入端点路由是为了将路由与实际端点分离,说得白话一点,就是让URL地址和实际执行的Action进行分离,这会让框架更加灵活,同时这意味着新的端点不需要实现自己的路由。

创建自定义接口

创建端点的最简单方法是使用lambda:

app.Map("/map", async context => {  
    await context.Response.WriteAsync("OK"); 
});

这里将/map路由映射到一个简单的端点,该端点将单词“OK”写入响应流。

关于早期.NET 6.0版本的说明
.NET 6.0之前,该映射只能在Startup.cs文件中的UseEndpoints方法中,而使用.NET 6.0和新的Minimal API方法,可以在Program.cs文件中完成映射。

另外,我们需要将Microsoft.AspNetCore.Http命名空间添加到using语句中。
还可以将特定的HTTP方法(如GET、POST、PUT和DELETE)映射到端点。以下代码显示了如何映射GET和POST方法:

app.MapGet("/mapget", async context => {     
    await context.Response.WriteAsync("Map GET"); 
}); 
app.MapPost("/mappost", async context => {  
        await context.Response.WriteAsync("Map POST");
});

我们还可以将两个或多个HTTP方法映射到一个端点:

app.MapMethods("/mapmethods",  new[] { "DELETE", "PUT" }, 
    async context => {
        await context.Response.WriteAsync("Map Methods");
});

这些端点映射很像我们在第8篇定制.NET 6.0的Middleware中间件中看到的基于lambda的中间件组件,这些管道中间件会返回结果,例如基于HTML的视图、JSON结构化数据或类似的内容。但是,端点路由是一种更灵活的输出方式,它应该会在ASP.NET Core 3.0以后的所有版本中进行使用。

在第8篇中,我们看到我们可以像这样的分支管道:

app.Map("/map", mapped => {     // ……  });

以上这种方式也会创建一个路由,但只会侦听以/map开头的URL。如果您希望有一个处理/map/{id:int?}等模式的路由引擎,来匹配/map/456而不是/map/abc,那么您应该使用前面所述的新的路由。

而那些基于lambda的端点映射,对于简单的场景非常有用。然而,由于它们是在Program.cs中定义的,如果您想使用这种方式来实现更复杂的场景,代码维护性将变得很差。

因此,我们应该尝试找到一种更结构化的方法来创建自定义端点。

创建更复杂的接口

接下来,我们将创建一个健康检查接口例子,有点类似于您在Kubernetes集群中运行应用程序时可能需要的接口,用来检测系统的健康状态:
我们从开发者的角度定义API接口,我们首先添加一个MapMyHealthChecks方法,作为IEndpointRouteBuilder对象上的一个扩展方法,它没有实现:

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

为了避免混淆,我们这儿采取和之前类似的方式添加新接口,后面我们进一步来实现一下。
我们创建一个名为MapMyHealthChecksExtensions的静态类,并在MapMyHealthCheck中放置一个扩展方法,该对象扩展IEndpointRouteBuilder接口并返回IEndpointConventionBuilder对象:

namespace RoutingSample; 
public static class MapMyHealthChecksExtensions {     
    public static IEndpointConventionBuilder  MapMyHealthChecks (this IEndpointRouteBuilder endpoints, string pattern = "/myhealth")     
    {         
        // ...     
    } 
}

以上只是骨架,实际的接口将被实现为一个终止的中间件,也就是说,它不调用下一个的中间件组件,并创建响应流的输出:

namespace RoutingSample; 
public class MyHealthChecksMiddleware {     
    private readonly ILogger _logger;     
    public MyHealthChecksMiddleware (RequestDelegate next, ILogger logger)    
     {  
        _logger = logger;     
    }     

    public async Task Invoke(HttpContext context)     {         
        // add some checks here...         
        context.Response.StatusCode = 200;         
        context.Response.ContentType = "text/plain";         
        await context.Response.WriteAsync("OK");     
    } 
}

实际工作是在Invoke方法中完成的。目前,只演示200状态码和OK状态响应,我们可以在这里随意扩展该方法,例如检查数据库或相关服务的可用性。

接下来我们使用这个终止中间件,我们回到MapMyHealthChecks方法的框架。我们现在创建一个自己的管道,并将其映射到给定的pipeline:

var pipeline = endpoints.CreateApplicationBuilder().UseMiddleware().Build(); 
return endpoints.Map(pattern, pipeline).WithDisplayName("My custom health checks");

这种方法允许我们为这个新的管道添加更多的中间件。WithDisplayName扩展方法将配置的显示名称设置为接口,接下来按F5键启动程序,并在浏览器中调用https://localhost:7111/myhealth。我们将看到:
 


请注意,端口号可能会有所不同。我们还可以将已经存在的终止中间件组件转换为路由接口,以配置更加灵活的路由。

总结

ASP.NET Core支持请求处理并向请求提供信息的多种方法。接口路由是一种基于URL和请求的方法提供资源。
在本文,我们学习了如何使用终止中间件组件作为接口,并用将该接口映射到新的路由引擎,从而让我们的路由变得更加强大和灵活。
每个Web应用程序都需要了解系统用户,以允许或限制对特定数据的访问。在下一章中,我们将展示如何配置身份验证和识别用户。

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/864610.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

029 - integer types 整数类型

MySQL支持SQL标准整数类型 INTEGER(或INT)和 SMALLINT。作为一个可扩展标准,MySQL也支持整数类型 TINYINT,MEDIUMINT和 BIGINT。下表显示了每种整数类型所需的存储空间和范围。 表11.1 MySQL支持的整数类型的必需存储和范围 类型…

日常问题——idea工具中SpringBoot使用@AutoWriter 爆红

😜作 者:是江迪呀✒️本文关键词:日常BUG、BUG、问题分析☀️每日 一言 :存在错误说明你在进步! 一、问题描述 使用AutoWrited注解注入Bean时,变量下面有红线,但是不影响运行。 二…

【idea】点击idea启动没反应

RT 点击idea启动的时候没反应,接着百度报错,基本跟他们的也不一样。 首先我是做版本升级。其次,我之前是破解的。如果你也是跟我一样的话,那问题可能就处在破解上了 解决方式 首先,是跟大部分解决思路一样。先找到项…

【趋势检测和隔离】使用小波进行趋势检测和隔离研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

基于Java+SpringMVC+Mybaties+layui+Vue+elememt基于协同过滤的电影推荐系统的设计与实现

一.项目介绍 基于协调过滤的电影推荐系统的设计与实现 本系统分为普通用户以及管理员两类 普通用户: 登录系统查看最新推荐电影、收藏、评论、查看电影信息、 对电影进行评分、浏览电影资讯信息、查看个人信息以及浏览收藏…

【Python数据容器】--- 元组的基本使用

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【Python小白从入门到精通】🎈 本专栏旨在分享学习Python的一点学习心得,欢迎大家在评论区讨论💌 元组…

系统学习Linux-Redis集群

目录 一、Redis主从复制 概念 作用 缺点 流程 二、Reids哨兵模式(sentinel) 概念 作用 缺点 结构 搭建 三、redis集群 概述 原理 架构细节 选举过程 实验环境模拟 一、Redis主从复制 概念 是指将一台Redis服务器的数据,复制…

linux查看进程绑定cpu核是否成功

运行top命令,可以看到进程以及进程cpu占有率 然后查看是否有P属性,这个属性用来查看进程绑定的cpu核 这里没有看到cpu占用核心 运行top后,按 " f "键进入top配置界面,然后按上下键选择P选项,此时可以看到P选…

(二)结构型模式:2、桥接模式(Bridge Pattern)(C++实现示例)

目录 1、桥接模式(Bridge Pattern)含义 2、桥接模式应用场景 3、桥接模式的UML图学习 4、C实现桥接模式的示例 1、桥接模式(Bridge Pattern)含义 桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离&#…

不基于比较的排序:基数排序

本篇只是讨论桶排序的具体实现,想了解更多算法内容可以在我的博客里搜,建议大家看看这篇排序算法总结:排序算法总结_鱼跃鹰飞的博客-CSDN博客 桶排序的原理: 代码:sort1是一个比较二逼的实现方式浪费空间,s…

开源数据库Mysql_DBA运维实战 (DML/DQL语句)

DML/DQL DML INSERT 实现数据的 插入 实例: DELETE 实现数据的 删除 实例: UPDATE 实现数据的 更新 实例1: 实例2: 实例3: DQL DML/DQL DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELE…

IT运维:使用数据分析平台监控PowerStore存储(进阶)

概述 本文基于《IT运维:使用鸿鹄监控PowerStore存储》(以下简称原文)文章进行了优化。主要优化部分包括存储日志进入到鸿鹄后,如何进行字段抽取,以及图表的展示。 字段抽取:由原来采用视图的方式&#xff0…

Rider无法识别Todo Comment

最近因为vs code很难识别到代码中的usage和definition,改用Rider了。 但是一开始就哪里有点不对, 比如我主题的颜色总是有些地方无法识别出来。比如我每次从Unity中点击脚本文件,都只能识别到某一个特定的文件夹,而不能打开整个…

机器人技术及其影响

目录 1.概念 2.发展 3.应用领域 4.对人类的益处 1.概念 机器人是指能够自主执行任务的机械设备或电子设备。它们通常具有一定的感知、决策和执行能力,能够接收和处理来自外部环境的信息,并做出相应的行动。 机器人的形态和功能各异,可以是…

Python接口测试- requests 发送 post 请求的几种方法

前言: POST 请求用于向服务器发送数据。与 get 相比更安全,同时 post 请求一般会带来数据的更改。 GET 请求不论我们怎么构造,最终都是通过 URL 向服务器传递数据,而 post 通过消息体(报文主体)发送请求。…

简单的职员管理系统 SpringBoot企业员工信息java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 简单的职员管理系统 SpringBoot 系统有1权限&#xf…

海外电子商务源代码跨境系统开发,Java现成代码全开源

海外电子商务跨境系统的开发是一个复杂的过程,而利用现成的Java代码进行开发可以节省时间和成本。下面是海外电子商务跨境系统开发的全开源步骤。 第一步:需求分析和规划 在开发海外电子商务跨境系统之前,需要进行需求分析和规划。这包括确定…

迅镭激光PL12050重载型激光切管机中标国内知名企业美的集团!

近日,迅镭激光重型激光切管机中标国内知名企业——美的集团! 成立于2002年的菱王电梯,是美的集团暖通与楼宇事业部旗下的专业电梯品牌 ,业务覆盖电(扶)梯的研发、设计、制造、销售、安装和维保,自主研发的8m/s超高速电梯和8吨超重…

使用雅克比矩阵计算Rossler映射的lyapunov exponent图谱

Rossler映射如下: 雅可比行列式方法 计算Henon映射的Lyapunov exponent图谱,算法描述为: 0:初始化:初始化用到的值。参数a:[0,1.4],b:0.3,初始值x和y:1,迭代次数M:2000。 1:遍历参数a:计算不同a值所对应的Henon映射的Lyapunov exponent图谱。 2:迭代M次:…

selenium爬虫与配置谷歌浏览器的driver问题

用selenium爬虫时,明明已经安装了selenium模块,程序却运行不了。在使用selenium之前必须先配置浏览器对应版本的webdriver 本文主要涉及驱动有问题driver 网上有很多手动的方法(查看谷歌浏览的版本然后在其他博主分享的webdriver中下载与自己…