Содержание
Иногда бывает необходимо получить информацию о всех конечных точках (маршрутах) приложения в удобно для дальнейшего использования виде. И сегодня мы рассмотрим несколько вариантов получения информации о конечных точках в приложении. Во всех рассмотренных вариантах будет использован сервис, который включен в наше приложение 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
содержит следующие свойства:
Display |
Возвращает информационное отображаемое имя этой конечной точки. |
Metadata |
Возвращает коллекцию метаданных, связанных с этой конечной точкой. |
Request |
Возвращает делегат, используемый для обработки запросов к конечной точке. |
По сути, в предыдущем примере мы использовали метод 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
и получить исходный код графа конечных точек.