.net core httpContext.GetEndpoint().Metadata 都能获取到哪些元数据
在 .NET Core 或 ASP.NET Core 中,HttpContext.GetEndpoint() 方法用于获取当前请求路由到的终端点(Endpoint)。每个终端点都关联了一系列的元数据(Metadata),这些元数据可以通过 Endpoint.Metadata 集合访问。Metadata 集合中的元数据项可以是任意类型,通常用于提供关于终端点的额外信息或配置,如路由约束、认证需求、端点名称等。
具体能够获取到哪些元数据,取决于你的应用程序是如何配置这些元数据的。以下是一些常见的元数据项:
-
路由名称 (
Microsoft.AspNetCore.Routing.IRouteNameMetadata):如果路由配置时指定了名称,这个名称就可以通过这个元数据获取到。 -
授权元数据 (
Microsoft.AspNetCore.Authorization.IAuthorizeData[]或相关类型):如果你使用了基于策略的授权,那么这些元数据项会告诉 ASP.NET Core 如何验证请求的授权。 -
端点元数据 (
Microsoft.AspNetCore.Routing.EndpointMetadataCollection):虽然这不是一个具体的元数据项,但Metadata属性本身就是一个EndpointMetadataCollection类型的集合,可以包含任意数量的自定义或框架定义的元数据项。 -
自定义元数据:你可以通过
EndpointBuilder.MetadataAPI 或路由配置时的其他机制添加自定义的元数据项。这些元数据项的类型完全由你定义,用于在应用程序中传递关于终端点的额外信息。 -
请求处理器元数据:对于某些类型的终端点(如 MVC 控制器动作),可能会包含关于如何处理请求的特定元数据,如参数绑定信息、模型验证信息等。然而,这些通常不是直接通过
Endpoint.Metadata访问的,而是由 MVC 框架在内部使用。
要访问 HttpContext.GetEndpoint().Metadata 中的元数据,你需要遍历 Metadata 集合,并根据元数据的类型进行相应的处理。由于元数据集合可能包含多种不同类型的元数据项,因此你可能需要使用类型检查(如 is 关键字或 as 运算符)或模式匹配(在 C# 7.0 及更高版本中可用)来确定每个元数据项的类型,并据此采取相应的行动。
例如,如果你想要检查一个端点是否关联了特定的路由名称,你可以这样做:
| var endpoint = httpContext.GetEndpoint(); | |
| if (endpoint?.Metadata.GetMetadata<IRouteNameMetadata>() is IRouteNameMetadata routeNameMetadata) | |
| { | |
| // 使用 routeNameMetadata.RouteName | |
| } |
在这个例子中,GetMetadata<T>() 是一个扩展方法,用于在 EndpointMetadataCollection 中查找特定类型的元数据项。如果找到了,就将其转换为相应的类型并进行进一步的处理。如果没有找到,GetMetadata<T>() 会返回 null。
浙公网安备 33010602011771号