Перейти к содержанию

Ветвление конвейера с помощью метода расширения Map

Метод расширения Map() позволяет организовать конвейер промежуточного ПО в ветвящуюся структуру; выбор ветви при этом зависит от URL запроса.
Pasted image 20220906105557.png

Примечание

Сопоставление URL-адресов в методе Map() концептуально аналогично маршрутизации, но гораздо проще и со множеством ограничений. Например, используется простое сопоставление префиксов, и нельзя использовать параметры маршрута. Как правило, следует отдавать предпочтение созданию конечных точек, а не ветвлению с использованием Map()

Например, предположим, что мы хотим создать простую конечную точку проверки работоспособности при помощи метода Run(). Однако, мы хотим, чтобы проверка работоспособности выполнялась только по запросу на URL-адрес /ping, а все остальные запросы работали при помощи Razor Pages1.

Добавим ветвь конвейера с помощью метода расширения Map():

public void Configure(IApplicationBuilder app)
{
    app.UseDeveloperExceptionPage();

    app.Map("/ping", (IApplicationBuilder branch) =>
    {
        branch.UseExceptionHandler();
        branch.Run(async (HttpContext context) =>
        {
            context.Response.ContentType = "text/plain";
            await context.Response.WriteAsync("pong");
        });
    });

    app.UseStaticFiles();
    app.UseRouting();
    app.UseEndpoints(endpoints => endpoints.MapRazorPages());
}

В этом примере все запросы, начинающиеся с /ping, будут проходить по ветви, определенной для билдера branch: например, /ping, /ping/go или /ping?id=123, а значит, будут возвращать простой ответ "pong".

При необходимости вызовы Map() можно вкладывать друг в друга, чтобы делать более сложное ветвление конвейера. Однако для сложных сценариев лучше использовать механизм маршрутизации конечных точек.

Одной из ситуаций, когда метод Map() может быть полезен — необходимость получить два “независимых” более мелких приложения, но развёртываемых одновременно. Однако в этом случае приложения будут иметь общие конфигурацию и контейнер внедрения зависимостей2.

Последний момент, о котором необходимо помнить — то, что метод Map() изменяет свойство Path, которое видит промежуточное ПО в ветви. Сегменты, совпадающие с префиксом ветви, отсекаются и перемещаются в свойство PathBase.
Pasted image 20220906113337.png
Свойство PathBase может использоваться, например, генератором ссылок для генерации правильных адресов.


  1. Сценарий с проверкой работоспособности взят для демонстрации. В реальности следует использовать встроенную в ASP.NET Core проверку работоспособности. Подробнее 

  2. О создании по-настоящему независимых ветвей см. здесь 


Последнее обновление : 9 мая 2023 г.
Дата создания : 26 октября 2022 г.

Комментарии

Комментарии