- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进.
在本文中,我们将讨论 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 可以映射到以下端点:
在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应用程序都需要了解系统用户,以允许或限制对特定数据的访问。在下一章中,我们将展示如何配置身份验证和识别用户.
最后此篇关于在.NET6.0中自定义接口路由的文章就讲到这里了,如果你想了解更多关于在.NET6.0中自定义接口路由的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试在我的代码库中为我正在编写的游戏服务器更多地使用接口(interface),并了解高级概念以及何时应该使用接口(interface)(我认为)。在我的例子中,我使用它们将我的包相互分离,并使
我有一个名为 Widget 的接口(interface),它在我的整个项目中都在使用。但是,它也用作名为 Widget 的组件的 Prop 。 处理此问题的最佳方法是什么?我应该更改我的 Widget
有一个接口(interface)可以是多个接口(interface)之一 interface a {x:string} interface b {y:string} interface c {z:st
我遇到了一种情况,我需要调用第三方服务来获取一些信息。这些服务对于不同的客户可能会有所不同。我的界面中有一个身份验证功能,如下所示。 interface IServiceProvider { bool
在我的例子中,“RequestHandlerProxy”是一个结构,其字段为接口(interface)“IAdapter”,接口(interface)有可能被调用的方法,该方法的输入为结构“Reque
我有一个接口(interface)Interface1,它已由类A实现,并且设置了一些私有(private)变量值,并且我将类A的对象发送到下一个接受输入作为Interface2的类。那么我怎样才能将
假设我有这样的类和接口(interface)结构: interface IService {} interface IEmailService : IService { Task SendAs
有人知道我在哪里可以找到 XML-RPC 接口(interface)的定义(在 OpenERP 7 中)?我想知道创建或获取对象需要哪些参数和对象属性。每个元素的 XML 示例也将非常有帮助。 最佳答
最近,我一直在阅读有关接口(interface)是抽象的错误概念的文章。一篇这样的帖子是http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstract
如果我有一个由第三方实现的现有 IInterface 后代,并且我想添加辅助例程,Delphi 是否提供了任何简单的方法来实现此目的,而无需手动重定向每个接口(interface)方法?也就是说,给定
我正在尝试将 Article 数组分配给我的 Mongoose 文档,但 Typescript 似乎不喜欢这样,我不知道为什么它显示此警告/错误,表明它不可分配. 我的 Mongoose 模式和接口(
我有两个接口(interface): public interface IController { void doSomething(IEntity thing); } public inte
是否可以创建一个扩展 Serializable 接口(interface)的接口(interface)? 如果是,那么扩展接口(interface)的行为是否会像 Serilizable 接口(int
我试图在两个存储之间创建一个中间层,它从存储 A 中获取数据,将其转换为相应类型的存储 B,然后存储它。由于我需要转换大约 50-100 种类型,我希望使用 map[string]func 并根据 s
我正在处理一个要求,其中我收到一个 JSON 对象,其中包含一个日期值作为字符串。我的任务是将 Date 对象存储在数据库中。 这种东西: {"start_date": "2019-05-29", "
我们的方法的目标是为我们现有的 DAO 和模型类引入接口(interface)。模型类由各种类型的资源 ID 标识,资源 ID 不仅仅是随机数,还带有语义和行为。因此,我们必须用对象而不是原始类型来表
Collection 接口(interface)有多个方法。 List 接口(interface)扩展了 Collection 接口(interface)。它声明与 Collection 接口(int
我有一个 Java 服务器应用程序,它使用 Jackson 使用反射 API 对 DTO 进行一般序列化。例如对于这个 DTO 接口(interface): package com.acme.libr
如果我在 Kotlin 中有一个接口(interface): interface KotlinInterface { val id: String } 我可以这样实现: class MyCla
我知道Java中所有访问修饰符之间的区别。然而,有人问了我一个非常有趣的问题,我很难找到答案:Java 中的 private 接口(interface)和 public 接口(interface)有什
我是一名优秀的程序员,十分优秀!