Получение токенизированного пути, соответствующего шаблону маршрута (ASP. NET Core 3.1) - PullRequest
2 голосов
/ 15 марта 2020

Я пытаюсь выяснить лучший подход к получению фрагмента исходного 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);
    }
}

1 Ответ

0 голосов
/ 17 марта 2020

Согласно основной команде ASP. NET, в настоящее время нет API, обеспечивающего фрагмент строки (или эквивалентную структуру), соответствующий только сигнатуре шаблона маршрута.

Я решил создать фрагмент из значения маршрута, как видно из следующего фрагмента:

[ApiController]
[ApiVersion("1.0")]
[Route("api/v{apiVersion:apiVersion}/[controller]")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class ProxyController : ControllerBase
{
    .. constructors and other members omitted for brevity

    [HttpGet]
    [HttpPost]
    [HttpPut]
    [HttpDelete]
    [Authorize]
    [Route("v{version:int}/organizations/{organizationID:int}/{*path}")]
    public async Task OrganizationsAsync(int version, int organizationID, string path, CancellationToken cancellation = default)
    {
        await this.HandleAsync($"v{version}/organizations/{organizationID}/{path}", cancellation);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...