Маршрутизация в ASP.NET Core. Получение информации о конечных точках в приложении (EndpointDataSource)

Иногда бывает необходимо получить информацию о всех конечных точках (маршрутах) приложения в удобно для дальнейшего использования виде. И сегодня мы рассмотрим несколько вариантов получения информации о конечных точках в приложении. Во всех рассмотренных вариантах будет использован сервис, который включен в наше приложение ASP.NET Core по умолчанию — EndpointDataSource.

Простой перечень конечных точек приложения

В следующем примере показано как получить простой список всех конечных точек приложения:

public static void Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);

    var app = builder.Build();

    app.MapGet("/",()=>"Index Page");
    app.MapPost("/add", () => "Add new element");
    app.MapPost("/add/data", () => "Add new data");
    app.MapGet("/add/data/element", () => "Add data element");
    app.MapMethods("/edit", new[] { "GET", "POST", "PUT"}, () => "Add new element");


    app.MapGet("/endpoints", (EndpointDataSource points) => string.Join("\n", points.Endpoints));

    app.Run();

}

Здесь стоит обратить внимание на последнюю конечную точку:

app.MapGet("/endpoints", (EndpointDataSource points) => string.Join("\n", points.Endpoints));

здесь мы через механизм Dependency Injection запрашиваем сервис EndpointDataSource, который является сервисом с жизненным циклом singleton и содержит коллекцию Endpoints — конечных точек приложения. Используя метод Join мы получаем строку и, затем, выводим эту строку пользователю. Результат работы приложения будет следующим:

Для каждой точки мы получаем протокол, по которому должен идти запрос, доступные для конечной точки методы HTTP (GET, POST и т.д.) и путь.

Получение метаданных для конечных точек

При желании, мы можем получить информацию о конечной точки в виде метаданных. Каждая конечная точка из коллекции EndpointDataSource.Endpointsсодержит следующие свойства:

DisplayName Возвращает информационное отображаемое имя этой конечной точки.
Metadata Возвращает коллекцию метаданных, связанных с этой конечной точкой.
RequestDelegate Возвращает делегат, используемый для обработки запросов к конечной точке.

По сути, в предыдущем примере мы использовали метод ToString() контрольной точки, который возвращает значение свойства DisplayName. Теперь посмотрим, как можно получить данные о пути и методах раздельно:

app.MapGet("/endpoints", async (HttpContext context, EndpointDataSource points) => 
{
    context.Response.ContentType = "text/html; charset=utf-8";
    StringBuilder sb = new StringBuilder();

    sb.Append("<table>");
    sb.Append("<tr><<td>Путь</td><td>Доступные методы</td></tr>");
    foreach (var point in points.Endpoints)
    {
        var data = point as RouteEndpoint;

        sb.Append("<tr>");
        sb.Append($"<td>{data.RoutePattern.RawText}</td>");

        var httpMethodsMetadata = data.Metadata.OfType<HttpMethodMetadata>().FirstOrDefault();
        var httpMethods = httpMethodsMetadata?.HttpMethods; // [GET, POST, ...]

        sb.Append($"<td>{string.Join(",", httpMethods)}</td>");
        sb.Append("</tr>");
    }
    sb.Append("</table>");

    return sb.ToString();

});

здесь мы приводим конечную точку к типу RouteEndpoint и, далее, выводим в html-таблицу сведения о пути и доступных методах. В приложении это будет выглядеть вот так:

Визуализация конечных точек в ASP.NET Core

Третий вариант получения информации о конечных точках — это их визуализация в виде графа. Опять же, в пустом приложении ASP.NET Core уже зарегистрирован один интересный сервис под названием DfaGraphWriter. Для этого сервиса дано следующее описание:

Одноэлементный (singleton) сервис, который можно использовать для записи таблицы маршрутов в качестве конечного автомата на языке DOT GraphViz

У этого сервиса определен всего один публичный метод для записи маршрутов:

public void Write(EndpointDataSource dataSource, TextWriter writer)

мы должны предоставить в метод список контрольных точек (EndpointDataSource) и объект типа TextWriter в который будет непосредственно происходить запись о маршрутах. Вернемся к нашему примеру и попробуем воспользоваться этим сервисом:

app.MapGet("/endpoints", async (HttpContext context, EndpointDataSource points, DfaGraphWriter graph) => 
{
    context.Response.ContentType = "text/plain; charset=utf-8";

    await using var sw = new StringWriter();
    graph.Write(points, sw);
    return sw.ToString();
});

Здесь мы уже запросили два сервиса и, затем произвели запись в объект StringWriter сведений о маршрутах. Посмотрим на результат в приложении:

Чтобы визуализировать эти данные, можно воспользоваться сервисом: http://www.webgraphviz.com/ Например, у меня получился вот такой график:

Итого

Сегодня мы рассмотрели три варианта получения информации о конечных точках в приложении ASP.NET Core. Все эти три способа используют один и тот же сервис — EndpointDataSource, который содержит коллекцию конечных точек приложения ASP.NET Core. В зависимости от потребностей, вы можете получить информацию, как в виде текста, так и воспользоваться сервисом DfaGraphWriter и получить исходный код графа конечных точек.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии