测试的大部分内容与中间件相同,但是我们没有编写响应,而是编写了xUnit的ITestOutputHelper以将记录测试的结果输出。在Visual Studio中,您可以通过以下方式查看此输出:打开“测试资源管理器”,导航到GenerateGraph测试,然后单击“为此结果打开其他输出”,这将以选项卡的形式打开结果:
我发现像这样的简单测试通常足以满足我的目的。在我看来有如下这些优点:
它不会将此数据公开为终结点
对您的应用没有影响
容易产生
不过,也许您想从应用程序中生成此图,但是您不想使用到目前为止显示的任何一种中间件方法将其包括在内。如果是这样,请务必小心在哪里进行。
您无法在IHostedService中生成图形一般而言,您可以在应用程序中任何使用依赖项注入或有权访问实例的任何位置通过IServiceProvider访问DfaGraphWriter和EndpointDataSource服务。这意味着在请求的上下文中(例如从MVC控制器或Razor Page生成)图很容易,并且与您到目前为止所看到的方法相同。
如果您要尝试在应用程序生命周期的早期生成图形,则必须小心。尤其是IHostedService。
在ASP.NET Core 3.0中,Web基础结构是在通用主机的基础上重建的,这意味着您的服务器(Kestrel)作为一个IHostedService在你的应用程序中运行的。在大多数情况下,这不会产生太大影响,但是与ASP.NET Core 2.x相比,它改变了应用程序的生成顺序。
在ASP.NET Core 2.x中,将发生以下情况:
中间件管道已建立。
服务器(Kestrel)开始侦听请求。
在IHostedService实现启动。
而是在ASP.NET Core 3.x上,如下所示:
IHostedService实现启动。
GenericWebHostService
启动:
中间件管道已建立
服务器(Kestrel)开始侦听请求。
需要注意的重要一点是,直到您的IHostedServices的执行后中间件管道才会建立。由于UseEndpoints()尚未被调用,EndpointDataSource将不包含任何数据!
如果您尝试从一个IHostedService中的DfaGraphWriter生成图表,该EndpointDataSource是空的。
如果尝试使用其他标准机制来注入早期行为,情况也是如此,如IStartupFilter- Startup.Configure()执行之前 调用 ,因此EndpointDataSource将为空。
同样,您不能只是在Program.Main调用IHostBuilder.Build()来构建一个Host,然后使用IHost.Services:来访问服务,直到您调用IHost.Run,并且服务器已启动,否则您的终结点列表将为空!
这些限制可能不是问题,具体取决于您要实现的目标。对我来说,单元测试方法可以解决我的大多数问题。
无论使用哪种方法,都只能生成本文中显示的“默认”终结点图。这隐藏了很多真正有用的信息,例如哪些节点生成了终结点。在下一篇文章中,我将展示如何创建自定义图形编写器,以便您可以生成自己的图形。
总结在这篇文章中,我展示了如何使用DfaGraphWriter和EndpointDataSource创建应用程序中所有终结点的图形。我展示了如何创建中间件终结点来公开此数据,以及如何将这种中间件与分支中间件策略一起用作终结点路由。
我还展示了如何使用简单的集成测试来生成图形数据而无需运行您的应用程序。这避免了公开(可能敏感)的终结点图,同时仍然允许轻松访问数据。
最后,我讨论了何时可以在应用程序的生命周期中生成图形。该EndpointDataSource未填充,直到后Server(Kestrel)已经开始,所以你主要限于在请求上下文访问数据。IHostedService和IStartupFilter执行得太早以至于无法访问数据,IHostBuilder.Build()只是构建DI容器,而没有构建中间件管道。