.net core httpContext.GetEndpoint().Metadata 都能获取到哪些元数据

 

 

在 .NET Core 或 ASP.NET Core 中,HttpContext.GetEndpoint() 方法用于获取当前请求路由到的终端点(Endpoint)。每个终端点都关联了一系列的元数据(Metadata),这些元数据可以通过 Endpoint.Metadata 集合访问。Metadata 集合中的元数据项可以是任意类型,通常用于提供关于终端点的额外信息或配置,如路由约束、认证需求、端点名称等。

具体能够获取到哪些元数据,取决于你的应用程序是如何配置这些元数据的。以下是一些常见的元数据项:

  1. 路由名称 (Microsoft.AspNetCore.Routing.IRouteNameMetadata):如果路由配置时指定了名称,这个名称就可以通过这个元数据获取到。

  2. 授权元数据 (Microsoft.AspNetCore.Authorization.IAuthorizeData[] 或相关类型):如果你使用了基于策略的授权,那么这些元数据项会告诉 ASP.NET Core 如何验证请求的授权。

  3. 端点元数据 (Microsoft.AspNetCore.Routing.EndpointMetadataCollection):虽然这不是一个具体的元数据项,但 Metadata 属性本身就是一个 EndpointMetadataCollection 类型的集合,可以包含任意数量的自定义或框架定义的元数据项。

  4. 自定义元数据:你可以通过 EndpointBuilder.Metadata API 或路由配置时的其他机制添加自定义的元数据项。这些元数据项的类型完全由你定义,用于在应用程序中传递关于终端点的额外信息。

  5. 请求处理器元数据:对于某些类型的终端点(如 MVC 控制器动作),可能会包含关于如何处理请求的特定元数据,如参数绑定信息、模型验证信息等。然而,这些通常不是直接通过 Endpoint.Metadata 访问的,而是由 MVC 框架在内部使用。

要访问 HttpContext.GetEndpoint().Metadata 中的元数据,你需要遍历 Metadata 集合,并根据元数据的类型进行相应的处理。由于元数据集合可能包含多种不同类型的元数据项,因此你可能需要使用类型检查(如 is 关键字或 as 运算符)或模式匹配(在 C# 7.0 及更高版本中可用)来确定每个元数据项的类型,并据此采取相应的行动。

例如,如果你想要检查一个端点是否关联了特定的路由名称,你可以这样做:

csharp复制代码
  var endpoint = httpContext.GetEndpoint();
  if (endpoint?.Metadata.GetMetadata<IRouteNameMetadata>() is IRouteNameMetadata routeNameMetadata)
  {
  // 使用 routeNameMetadata.RouteName
  }

在这个例子中,GetMetadata<T>() 是一个扩展方法,用于在 EndpointMetadataCollection 中查找特定类型的元数据项。如果找到了,就将其转换为相应的类型并进行进一步的处理。如果没有找到,GetMetadata<T>() 会返回 null

posted on 2024-08-11 18:12  是水饺不是水饺  阅读(174)  评论(0)    收藏  举报

导航