导航网站系统,网站建设论文答辩ppt,wordpress问答中心,广州定制网站公司在本文中#xff0c;我们将讨论ASP.NET Core中的新路由。我们将了解什么是接口(endpoints)路由#xff0c;它是如何工作的#xff0c;它在哪里使用#xff0c;以及如何创建自己的路由。
本文主题#xff1a;
探索接口路由创建自定义接口创建更复杂的接口 名词定义#…在本文中我们将讨论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: {controllerHome}/{actionIndex}/{id?});
});如果路由或路由模式与传入请求的URL匹配则请求将映射到该端点。ASP.NET Core可以映射到以下端点
Controllers (例如, MVC or web APIs)Razor PagesSignalR (and Blazor Server)gRPC servicesHealth 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:{controllerHome}/{actionIndex}/{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应用程序都需要了解系统用户以允许或限制对特定数据的访问。在下一章中我们将展示如何配置身份验证和识别用户。