[译]使用DOT语言和GraphvizOnline来可视化你的ASP.NETCore3.0终结点01

这是系列文章中的第一篇:使用GraphvizOnline可视化ASP.NETCore3.0终结点。.

  1. 第1部分-使用DOT语言来可视化你的ASP.NETCore3.0终结点(本文)

  2. 第2部分-向ASP.NET Core应用程序添加终节点图

  3. 第3部分-使用ImpromptuInterface创建一个自定义的DfaGraphWriter,以便于反射

作者:依乐祝
原文:https://andrewlock.net/visualizing-asp-net-core-endpoints-using-graphvizonline-and-the-dot-language/
译文:https://www.cnblogs.com/yilezhu/p/13301981.html

在这篇文章中,我将展示如何在ASP.NETCore3.0应用程序中使用GraphvizOnline服务。这使您可以创建如下所示的图表,这些图表描述了应用程序中的所有端点:

用GraphvizOnline和DOT语言绘制图形

GraphvizOnline是一个GitHub上的开源项目,它为DOT图形描述语言 提供了一个在线可视化工具。这是一种简单的语言,它允许您定义各种类型的图形,它将节点与边连接起来。

例如,一个基本的无向图可以定义为

graph MyGraph {a -- b -- c;b -- d;
}

它描述了以下图表:

每个节点都有一个名称(abcd),并且--定义节点之间的边缘。边定义节点之间的连接,但它们没有方向(因此名称,无向【undirected】).

当然,你也可以定义一个有向图,其中边是有方向的。对于有向边,使用->而不是--。例如:

digraph MyGraph {a -> b -> c;d -> b;
}

它描述了以下图表:

您可以自定义节点和边缘以多种方式显示的方式。例如,可以标记节点和边缘:

digraph MySimpleGraph {// The label attribute can be used to change the label of a node...a [label="Foo"];b [label="Bar"];// ... or an edgea -> b [label="Baz"];
}

你可以使用DOT图形描述语言做更多的事情,这正是我们现在所需要的。那么,这如何应用于ASP.NET Core应用程序呢?

使用有向图来可视化ASP.NET Core终结点

ASP.NETCore中的终结点路由系统通过创建端点URL段的有向图来有效地工作。然后将传入的请求与图进行匹配(一次一个段),以确定要执行的终结点。

例如,以下简单有向图表示ASP.NET Core3.0 RazorPages 默认应用程序模板中的终结点(dotnet new webapp),其中包含三个Razor页面:Index.cshtmlError.cshtmlPrivacy.cshtml:

digraph DFA {1 [label="/Error/"]2 [label="/Index/"]3 [label="/Privacy/"]4 -> 1 [label="/Error"]4 -> 2 [label="/Index"]4 -> 3 [label="/Privacy"]4 [label="/"]
}

其中描述为如下图表:

.

在上面的DOT文件中,节点被赋予顺序的整数名,123等,并使用端点名称进行标记。这是ASP.NET Core用于表示终结点图的格式。

对于Razor页面,路由非常简单,所以图非常明显。ASP.NET Core WebAPI应用程序生成了一个更有趣的图表。例如,下面显示的ASP.NET Core 2.0默认模板中包含的ValuesController。它使用多个HTTP谓词,以及稍微复杂的URL结构:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{// GET api/values[HttpGet]public ActionResult<IEnumerable<string>> Get() => new string[] { "value1", "value2" };// GET api/values/5[HttpGet("{id}")]public ActionResult<string> Get(int id) => "value";// POST api/values[HttpPost]public void Post([FromBody] string value) { }// PUT api/values/5[HttpPut("{id}")]public void Put(int id, [FromBody] string value) { }// DELETE api/values/5[HttpDelete("{id}")]public void Delete(int id) { }
}

为了更好地度量,我还添加了一个基本的健康检查端点。UseEndpoints():

app.UseEndpoints(endpoints =>
{endpoints.MapHealthChecks("/healthz");endpoints.MapControllers();
});

此应用程序生成以下图表:

digraph DFA {1 [label="/healthz/"]2 [label="/api/Values/{...}/ HTTP: GET"]3 [label="/api/Values/{...}/ HTTP: PUT"]4 [label="/api/Values/{...}/ HTTP: DELETE"]5 [label="/api/Values/{...}/ HTTP: *"]6 -> 2 [label="HTTP: GET"]6 -> 3 [label="HTTP: PUT"]6 -> 4 [label="HTTP: DELETE"]6 -> 5 [label="HTTP: *"]6 [label="/api/Values/{...}/"]7 [label="/api/Values/ HTTP: GET"]8 [label="/api/Values/ HTTP: POST"]9 [label="/api/Values/ HTTP: *"]10 -> 6 [label="/*"]10 -> 7 [label="HTTP: GET"]10 -> 8 [label="HTTP: POST"]10 -> 9 [label="HTTP: *"]10 [label="/api/Values/"]11 -> 10 [label="/Values"]11 [label="/api/"]12 -> 1 [label="/healthz"]12 -> 11 [label="/api"]12 [label="/"]
}

表现为如下图表:

在这个图中还有很多事情要做,因为我们现在有了可变的路由参数值(路由模板中的{id},在图中显示为{...})和HTTP动词约束(GET/PUT/POST等等)

当我第一次看到这个图表时,我很难理解它。每个节点都是终结点吗?当然不是,如/api/不应该产生响应。那这个呢?至于HTTP: *端点呢,它们会产生响应吗?

为了进一步了解,我查阅了可以生成这些图的ASP.NET Core中的代码,但它有点复杂,不幸的是,由于大量使用internal类。我将在稍后的文章中探讨这些代码。

为了更好地理解端点图,我们需要了解并非所有的节点都是相同的。在下一节中,我们将深入研究这个简单图中的不同类型的节点,然后研究一个更好的图形表示(至少在我看来!)

了解不同类型的节点。

图中的每个节点都与给定的“深度”相关联。这是应该已经匹配的URL段数。例如,/api/Values/节点的深度为2-它要求空段//api段已经匹配。

当请求到达EndpointRoutingMiddleware(由UseRouting()添加)时,将传入的请求URL与此图进行比较。试图从树梢的根节点开始,通过图表找到一条路径。URL段与图中的边进行增量匹配,并在图中遍历一条路径,直到整个请求URL匹配为止。

每个节点(由在ASP.NET Core中的DfaNode中)有几个属性。我们目前感兴趣的属性是:

  • Matches*这是与该节点相关联的Endpoint(S)。如果通过路由匹配此节点,则这是将被选择用于执行的Endpoint

  • Literals这些是连接节点的边缘。如果DfaNodeLiterals,它具有可以进一步遍历以到达其他节点的文字段。例如,/api/节点包含一个有/Values值的Literal,则指向/api/Values节点。

  • PolicyEdges这些边缘是基于URL以外的约束进行匹配的。例如,图中基于动词的边,如HTTP: GET,是策略的边缘,指的是不同的DfaNode.

  • Parameters如果节点具有支持路由参数的边缘(例如,{id}), Parameters指向处理匹配参数的节点。这在图中是用/*边表示的。.

还有一个附加的属性,CatchAll,这在某些图形中是相关的,但我现在将忽略它,因为我们的API图并不需要它。

基于这些特性,我们可以通过使用DOT语言的其他特性,如形状、颜色、线型和箭头:

上图中添加了以下内容:

  • 没有任何关联的节点Endpoint都以默认样式显示,即黑色气泡。

  • Matches的显示为填充的棕色盒子。这些节点具有Endpoint,这可以产生响应。对于上面的API示例,这适用于已选择谓词的节点以及健康检查端点。

  • 文字段边缘显示为默认的黑色边缘,带有一个填充箭头。

  • Parameters边缘(/*)以蓝色显示,使用菱形箭头。

  • PolicyEdges以红色显示,带有虚线和空三角形箭头。

现在,我承认我的设计技巧很烂,但是我认为您可以同意这个图表显示的信息比默认的要多!????--这是生成上面的图形的定义,请记住,您可以使用在线编辑来可视化和播放显示。

digraph DFA {1 [label="/healthz/" shape=box style=filled color="brown" fontcolor="white"]2 [label="/api/Values/{...}/ HTTP: GET" shape=box style=filled color="brown" fontcolor="white"]3 [label="/api/Values/{...}/ HTTP: PUT" shape=box style=filled color="brown" fontcolor="white"]4 [label="/api/Values/{...}/ HTTP: DELETE" shape=box style=filled color="brown"  fontcolor="white"]5 [label="/api/Values/{...}/ HTTP: *" shape=box style=filled color="brown" fontcolor="white"]6 -> 2 [label="HTTP: GET" color="red" style=dashed arrowhead=open]6 -> 3 [label="HTTP: PUT" color="red" style=dashed arrowhead=open]6 -> 4 [label="HTTP: DELETE" color="red" style=dashed arrowhead=open]6 -> 5 [label="HTTP: *" color="red" style=dashed arrowhead=open]6 [label="/api/Values/{...}/"]7 [label="/api/Values/ HTTP: GET" shape=box style=filled color="brown" fontcolor="white"]8 [label="/api/Values/ HTTP: POST" shape=box style=filled color="brown" fontcolor="white"]9 [label="/api/Values/ HTTP: *" shape=box style=filled color="brown" fontcolor="white"]10 -> 6 [label="/*" arrowhead=diamond color="blue"]10 -> 7 [label="HTTP: GET" color="red" style=dashed arrowhead=open]10 -> 8 [label="HTTP: POST" color="red" style=dashed arrowhead=open]10 -> 9 [label="HTTP: *" color="red" style=dashed arrowhead=open]10 [label="/api/Values/"]11 -> 10 [label="/Values"]11 [label="/api/"]12 -> 1 [label="/healthz"]12 -> 11 [label="/api"]12 [label="/"]
}

注意"HTTP: *"节点与端点关联,即使您可能不期望它,因为它们返回405 Method Not Allowed.

在下一篇文章中,我将展示如何自动为自己的ASP.NET Core应用程序生成端点图。

总结

在这篇文章中,我介绍了用于描述图形的DOT语言,并展示了如何使用在线编辑从图表中创建图像。然后,我展示了如何将ASP.NETCore 3.x应用程序中的端点路由表示为有向图。我描述了端点图中不同节点和边缘之间的差异,并调整了图形的显示以更好地表示这些差异。在后面的文章中,我将展示如何为应用程序生成自己的端点图,如何自定义显示,以及如何做的不仅仅是查看图形。

往期精彩回顾

【推荐】.NET Core开发实战视频课程 ★★★

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

【.NET Core微服务实战-统一身份认证】开篇及目录索引

Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

10个小技巧助您写出高性能的ASP.NET Core代码

用abp vNext快速开发Quartz.NET定时任务管理界面

在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

现身说法:实际业务出发分析百亿数据量下的多表查询优化

关于C#异步编程你应该了解的几点建议

C#异步编程看这篇就够了

给我好看 
您看此文用  · 秒,转发只需1秒呦~
好看你就点点我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core CLI 的性能诊断工具介绍

前言开发人员的.NET Core项目上线后&#xff0c;经常会出现各种问题&#xff0c;内存泄漏&#xff0c;CPU 100%&#xff0c;处理时间长等&#xff0c; 这个时候就需要快速并准确的发现问题&#xff0c;并解决问题&#xff0c; 除了项目本身的日志记录外&#xff0c;NET Core 为…

[SpringSecurity]HelloWorld入门案例

入门案例 第一步 创建springboot工程 第二步 引入相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springfram…

ASP.NET Core静态文件处理源码探究

前言静态文件&#xff08;如 HTML、CSS、图像和 JavaScript&#xff09;等是Web程序的重要组成部分。传统的ASP.NET项目一般都是部署在IIS上&#xff0c;IIS是一个功能非常强大的服务器平台&#xff0c;可以直接处理接收到的静态文件处理而不需要经过应用程序池处理&#xff0c…

[SpringSecurity]基本原理_过滤器链

SpringSecurity 本质是一个过滤器链&#xff1a; 从启动是可以获取到过滤器链&#xff1a; org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFil ter org.springframework.security.web.context.SecurityContextPersistenceFilter org.s…

通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序

最近两天在Linux中调试.NET Core应用程序&#xff0c;同时我发现在Linux中调试.NET Core应用程序并不容易。一直习惯在Visual Studio中进行编码和调试。现在我想的是可以简单快速的测试.NET Core应用在Linux。所以通过本篇文章我们能了解到如何在Windows中使用Visual Studio进行…

[SpringSecurity]基本原理_过滤器加载过程

过滤器如何进行加载的&#xff1f; 1.使用SpringSecurity配置过滤器 DelegatingFilterProxy 其中上面的getTargetBeanName()得到的名字是FilterChainProxy 找到FilterChainProxy这个类中的doFilter方法 最后两张图片里面的代码表示&#xff1a; 用了一个增强for循环和getFi…

[SpringSecurity]基本原理_两个重要的接口_UserDetailsService接口和PasswordEncoder接口

UserDetailsService接口 当什么也没有配置的时候&#xff0c;账号和密码是由 Spring Security 定义生成的。而在实际项目中 账号和密码都是从数据库中查询出来的。 所以我们要通过自定义逻辑控制认证逻辑。 如果需要自定义逻辑时&#xff0c;只需要实现 UserDetailsService 接…

.NET 开源项目 StreamJsonRpc 介绍[下篇]

阅读本文大概需要 9 分钟。大家好&#xff0c;这是 .NET 开源项目 StreamJsonRpc 介绍的最后一篇。上篇介绍了一些预备知识&#xff0c;包括 JSON-RPC 协议介绍&#xff0c;StreamJsonRpc 是一个实现了 JSON-RPC 协议的库&#xff0c;它基于 Stream、WebSocket 和自定义的全双工…

ASP.NET Core Blazor 初探之 Blazor Server

上周初步对Blazor WebAssembly进行了初步的探索(ASP.NET Core Blazor 初探之 Blazor WebAssembly)。这次来看看Blazor Server该怎么玩。Blazor ServerBlazor 技术又分两种&#xff1a;Blazor WebAssemblyBlazor ServerBlazor WebAssembly上次已经介绍过了&#xff0c;这次主要来…

[SpringSecurity]web权限方案_用户认证_设置用户名密码

设置登陆的用户名和密码 第一种方式&#xff1a;通过配置文件 spring.security.user.nameatguigu spring.security.user.passwordatguigu第二种方式&#xff1a;通过配置类 package com.atguigu.securitydemo1.config;import org.springframework.context.annotation.Bean; i…

[SpringSecurity]web权限方案_用户认证_查询数据库完成认证

#mysql 数据库连接 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:3306/demo?serverTimezoneUTC spring.datasource.usernameroot spring.datasource.passwordrootpackage com.atguigu.securitydemo1.config;i…

.Net Core 2.2升级3.1的避坑指南

写在前面微软在更新.Net Core版本的时候&#xff0c;动作往往很大&#xff0c;使得每次更新版本的时候都得小心翼翼&#xff0c;坑实在是太多。往往是悄咪咪的移除了某项功能或者组件&#xff0c;或者不在支持XX方法&#xff0c;这就很花时间去找回需要的东西了&#xff0c;下面…

[SpringSecurity]web权限方案_用户认证_自定义用户登录页面

在配置类中实现相关的配置 Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin() //自定义自己编写的登陆页面.loginPage("/login.html") //登陆页面设置.loginProcessingUrl("/user/login") //登陆访问路径.defa…

Asp.Net Core Blazor之容器部署

写在前面Docker作为开源的应用容器引擎&#xff0c;可以让我们很轻松的构建一个轻量级、易移植的容器&#xff0c;通过Docker方式进行持续交付、测试和部署&#xff0c;都是极为方便的&#xff0c;并且对于我们开发来说&#xff0c;最直观的优点还是解决了日常开发中的环境配置…

[SpringSecurity]web权限方案_用户授权_基于权限访问控制_基于角色访问控制_hasAuthority和hasAnyAuthority_hasRole和hasAnyRole

基于角色或权限进行访问控制 hasAuthority 方法 如果当前的主体具有指定的权限&#xff0c;则返回 true,否则返回 false 在配置类设置当前访问地址有哪些 Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin() //自定义自己编写的登…

.Net Core WebAPI + Axios +Vue 实现下载与下载进度条

写在前面老板说&#xff1a;系统很慢&#xff0c;下载半个小时无法下载&#xff0c;是否考虑先压缩再给用户下载&#xff1f;本来是已经压缩过了&#xff0c;不过第一反应应该是用户下的数量多&#xff0c;导致压缩包很大&#xff0c;然后自己测试发现&#xff0c;只是等待的时…

[SpringSecurity]web权限方案_用户授权_自定义403页面

自定义403页面 unauth.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><h1>没有访问权限</h1></body> </html>配置类…

三分钟Docker-环境搭建篇

如题目显示&#xff0c;三分钟让你学会在windows上安装docker环境&#xff0c;开启docker之旅的第一步。安装前要求Windows 10 64位&#xff1a;专业版&#xff0c;企业版或教育版&#xff08;内部版本16299或更高版本&#xff09;。必须启用Hyper-V控制面板->程序和功能-&g…

[SpringSecurity]web权限方案_用户注销

用户注销 在配置类中添加退出映射地址 //退出http.logout().logoutUrl("/logout").logoutSuccessUrl("/test/hello").permitAll();测试 修改配置类&#xff0c;登陆成功之后跳转到成功页面 在成功页面添加超链接&#xff0c;写设置退出路径 success.htm…

骚年快答 | 为何微服务项目都使用单体代码仓库?

【答疑解惑】| 作者 / Edison Zhou这是恰童鞋骚年的第265篇原创内容之前在学习微软的示例eShopOnContainers时发现它使用的是单体代码仓库库&#xff0c;之后又发现大家在进行微服务项目开发时也都在使用单体代码仓库。问题来了&#xff0c;为啥要微服务项目都要使用单体仓库&a…