Я пытаюсь выяснить лучший подход к получению фрагмента исходного URI запроса, который соответствует шаблону маршрута, т.е. https://apim.example.com/api/v1/controller/[a/{id}/b]
с [..]
, являющимся фрагментом, соответствующим шаблону маршрута ; путь доступен из this.Request.Path, но доступен ли фрагмент отдельно?
Я прочитал (все) документы, проверил все свойства экземпляра HttpRequest
и не нашел фактический токенизированный фрагмент (только метаданные, описывающие параметры контроллера / действия, такие как naming et c.). Мне нужен фрагмент как часть прокси-API (с шаблонами c обработчики).
Proxy API
Я пишу прокси-сервис в ASP.NET Core 3.1
(находится за Azure API Management
instance), который отображает подмножество удаленного API и применяет схему безопасности сверху. Прокси-сервер распознает набор известных сигнатур маршрутов для применения схемы безопасности в соответствии с запрошенным ресурсом (-ами).
Запрос отправлен на Azure Управление API (например):
https://apim.example.com/api/v1/organizations/{id}/{*path}
Запрос на прокси-сервер, переадресованный Azure API Management:
https://proxy.example.com/api/v1/proxy/v1/organizations/{id}/{*path}
Стоит отметить, что и прокси, и удаленный API предоставляют схему контроля версий (т.е. полный путь к прокси из Azure API) Управление). Прокси реализован с ASP.NET Core 3.1 routing
, как видно из следующего фрагмента:
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class ProxyController : ControllerBase
{
.. constructors and other members omitted for brevity
[HttpGet]
[HttpPost]
[HttpPut]
[HttpDelete]
[Route("v1/organizations/{id:int}/{*path}")]
public async Task OrganizationsAsync(int organizationID, string path, CancellationToken cancellation = default)
{
// would like to get the tokenized "v1/organizations/{id:int}/{*path}" fragment here
var message = await this.service.HandleAsync(this.Request, path, cancellation);
await this.handler.CopyAsync(this.HttpContext, message);
}
}
В OrganizationsAsync
Я ищу динамический c подход для получения фрагмента v1/organizations/{id:int}/{*path}
вместо необходимость предопределять различные базовые URI контроллера (как видно из следующего примера).
Использование предопределенного URI контроллера
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class ProxyController : ControllerBase
{
.. constructors and other members omitted for brevity
private readonly string baseUri = "api/v1/proxy";
[HttpGet]
[HttpPost]
[HttpPut]
[HttpDelete]
[Route("v1/organizations/{id:int}/{*path}")]
public async Task OrganizationsAsync(int organizationID, string path, CancellationToken cancellation = default)
{
var localpath = this.Request.Path.Value.Replace(this.baseUri, "");
var message = await this.service.HandleAsync(this.Request, localpath, cancellation);
await this.handler.CopyAsync(this.HttpContext, message);
}
}