云原生应用程序通常需要连接到各种服务,例如数据库、存储和缓存解决方案、消息传递提供商或其他 Web 服务。.NET Aspire 旨在简化这些类型服务之间的连接和配置。在本快速入门中,您将了解如何创建 .NET Aspire Starter 应用程序模板解决方案。
要使用 .NET Aspire,您需要在本地安装以下软件:
要创建新的 .NET Aspire Starter 应用程序模板解决方案,您可以使用 Visual Studio 或 .NET CLI。
Visual Studio 提供了 .NET Aspire 项目模板,可以为您处理一些初始设置配置。请完成以下步骤为本快速入门创建项目:
在 Visual Studio 顶部,导航到“文件” “新建” “项目”。
在对话框窗口中,搜索Aspire并选择.NET Aspire Starter Application。选择下一步。
在“配置新项目”屏幕上:
Visual Studio 创建了一个新的解决方案,该解决方案的结构是使用 .NET Aspire。
AspireSample目录:
└───?? AspireSample ├───?? AspireSample.ApiService │ ├───?? Properties │ │ └─── launchSettings.json │ ├─── appsettings.Development.json │ ├─── appsettings.json │ ├─── AspireSample.ApiService.csproj │ └─── Program.cs ├───?? AspireSample.AppHost │ ├───?? Properties │ │ └─── launchSettings.json │ ├─── appsettings.Development.json │ ├─── appsettings.json │ ├─── AspireSample.AppHost.csproj │ └─── Program.cs ├───?? AspireSample.ServiceDefaults │ ├─── AspireSample.ServiceDefaults.csproj │ └─── Extensions.cs ├───?? AspireSample.Web │ ├───?? Components │ │ ├───?? Layout │ │ │ ├─── MainLayout.razor │ │ │ ├─── MainLayout.razor.css │ │ │ ├─── NavMenu.razor │ │ │ └─── NavMenu.razor.css │ │ ├───?? Pages │ │ │ ├─── Counter.razor │ │ │ ├─── Error.razor │ │ │ ├─── Home.razor │ │ │ └─── Weather.razor │ │ ├─── _Imports.razor │ │ ├─── App.razor │ │ └─── Routes.razor │ ├───?? Properties │ │ └─── launchSettings.json │ ├───?? wwwroot │ │ ├───?? bootstrap │ │ │ ├─── bootstrap.min.css │ │ │ └─── bootstrap.min.css.map │ │ ├─── app.css │ │ └─── favicon.png │ ├─── appsettings.Development.json │ ├─── appsettings.json │ ├─── AspireSample.Web.csproj │ ├─── Program.cs │ └─── WeatherApiClient.cs └─── AspireSample.sln
└───?? AspireSample
├───?? AspireSample.ApiService
│ ├───?? Properties
│ │ └─── launchSettings.json
│ ├─── appsettings.Development.json
│ ├─── appsettings.json
│ ├─── AspireSample.ApiService.csproj
│ └─── Program.cs
├───?? AspireSample.AppHost
│ ├─── AspireSample.AppHost.csproj
├───?? AspireSample.ServiceDefaults
│ ├─── AspireSample.ServiceDefaults.csproj
│ └─── Extensions.cs
├───?? AspireSample.Web
│ ├───?? Components
│ │ ├───?? Layout
│ │ │ ├─── MainLayout.razor
│ │ │ ├─── MainLayout.razor.css
│ │ │ ├─── NavMenu.razor
│ │ │ └─── NavMenu.razor.css
│ │ ├───?? Pages
│ │ │ ├─── Counter.razor
│ │ │ ├─── Error.razor
│ │ │ ├─── Home.razor
│ │ │ └─── Weather.razor
│ │ ├─── _Imports.razor
│ │ ├─── App.razor
│ │ └─── Routes.razor
│ ├───?? wwwroot
│ │ ├───?? bootstrap
│ │ │ ├─── bootstrap.min.css
│ │ │ └─── bootstrap.min.css.map
│ │ ├─── app.css
│ │ └─── favicon.png
│ ├─── AspireSample.Web.csproj
│ ├─── Program.cs
│ └─── WeatherApiClient.cs
└─── AspireSample.sln
*.AppHost项目负责充当协调器,并将IsAspireHost项目文件的属性设置为true
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <IsAspireHost>true</IsAspireHost> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\AspireSample.ApiService\AspireSample.ApiService.csproj" /> <ProjectReference Include="..\AspireSample.Web\AspireSample.Web.csproj" /> </ItemGroup> <ItemGroup> <PackageReference Include="Aspire.Hosting" Version="8.0.0-preview.1.23557.2" /> </ItemGroup></Project>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAspireHost>true</IsAspireHost>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\AspireSample.ApiService\AspireSample.ApiService.csproj" />
<ProjectReference Include="..\AspireSample.Web\AspireSample.Web.csproj" />
</ItemGroup>
<PackageReference Include="Aspire.Hosting" Version="8.0.0-preview.1.23557.2" />
</Project>
AspireSample.AppHost项目的Program.cs文件:
var builder = DistributedApplication.CreateBuilder(args);var cache = builder.AddRedisContainer("cache");var apiservice = builder.AddProject<Projects.AspireSample_ApiService>("apiservice");builder.AddProject<Projects.AspireSample_Web>("webfrontend") .WithReference(cache) .WithReference(apiservice);builder.Build().Run();
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedisContainer("cache");
var apiservice = builder.AddProject<Projects.AspireSample_ApiService>("apiservice");
builder.AddProject<Projects.AspireSample_Web>("webfrontend")
.WithReference(cache)
.WithReference(apiservice);
builder.Build().Run();
*.ServiceDefaults项目是一个共享项目,用于管理在解决方案中的项目中重复使用的配置。该项目确保所有依赖服务共享相同的弹性、服务发现和 OpenTelemetry 配置。共享 .NET Aspire 项目文件包含IsAspireSharedProject设置为的属性true:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Library</OutputType> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <IsAspireSharedProject>true</IsAspireSharedProject> </PropertyGroup> <ItemGroup> <FrameworkReference Include="Microsoft.AspNetCore.App" /> <PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.ServiceDiscovery" Version="8.0.0-preview.1.23557.2" /> <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.7.0-alpha.1" /> <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.7.0-alpha.1" /> <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.5.1-beta.1" /> <PackageReference Include="OpenTelemetry.Instrumentation.GrpcNetClient" Version="1.5.1-beta.1" /> <PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.5.1-beta.1" /> <PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.5.1" /> </ItemGroup></Project>
<OutputType>Library</OutputType>
<IsAspireSharedProject>true</IsAspireSharedProject>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery" Version="8.0.0-preview.1.23557.2" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.7.0-alpha.1" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.7.0-alpha.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.5.1-beta.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.GrpcNetClient" Version="1.5.1-beta.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.5.1-beta.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.5.1" />
服务默认项目在IHostApplicationBuilder类型上公开一个名为 的扩展方法AddServiceDefaults。模板中的服务默认项目是一个起点,您可以对其进行自定义以满足您的需求。有关详细信息,请参阅.NET Aspire 服务默认值。
.NET Aspire 提供编排功能来协助配置应用程序不同部分之间的连接和通信。AspireSample.AppHost项目将AspireSample.ApiService和AspireSample.Web项目添加到应用程序模型中。它还声明了Blazor 前端的名称,以供 API 项目参考。此外,还添加了带有标签的 Redis 容器资源。这些名称用于配置应用程序中项目之间的服务发现和通信。"webfrontend""apiservice""redis"
前端应用程序定义了HttpClient用于与 API 项目通信的类型。
namespace AspireSample.Web;public class WeatherApiClient(HttpClient httpClient){ public async Task<WeatherForecast[]> GetWeatherAsync() { return await httpClient.GetFromJsonAsync<WeatherForecast[]>("/weatherforecast") ?? []; }}public record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary){ public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);}
namespace AspireSample.Web;
public class WeatherApiClient(HttpClient httpClient)
{
public async Task<WeatherForecast[]> GetWeatherAsync()
return await httpClient.GetFromJsonAsync<WeatherForecast[]>("/weatherforecast") ?? [];
}
public record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
配置为使用服务发现,请考虑AspireSample.Web项目的Program.csHttpClient文件中的以下代码:
using AspireSample.Web;using AspireSample.Web.Components;var builder = WebApplication.CreateBuilder(args);// Add service defaults & Aspire components.builder.AddServiceDefaults();builder.AddRedisOutputCache("cache");// Add services to the container.builder.Services.AddRazorComponents() .AddInteractiveServerComponents();builder.Services.AddHttpClient<WeatherApiClient>( static client=> client.BaseAddress = new("http://apiservice"));var app = builder.Build();if (!app.Environment.IsDevelopment()){ app.UseExceptionHandler("/Error", createScopeForErrors: true);}app.UseStaticFiles();app.UseAntiforgery();app.UseOutputCache();app.MapRazorComponents<App>() .AddInteractiveServerRenderMode(); app.MapDefaultEndpoints();app.Run();
using AspireSample.Web;
using AspireSample.Web.Components;
var builder = WebApplication.CreateBuilder(args);
// Add service defaults & Aspire components.
builder.AddServiceDefaults();
builder.AddRedisOutputCache("cache");
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddHttpClient<WeatherApiClient>(
static client=> client.BaseAddress = new("http://apiservice"));
var app = builder.Build();
if (!app.Environment.IsDevelopment())
app.UseExceptionHandler("/Error", createScopeForErrors: true);
app.UseStaticFiles();
app.UseAntiforgery();
app.UseOutputCache();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.MapDefaultEndpoints();
app.Run();
示例应用程序现已准备好进行测试。想要验证以下内容:
在 Visual Studio 中,通过右键单击“解决方案资源管理器”中的项目并选择“设置为启动项目”,将AspireSample.AppHost项目设置为启动项目。然后,按运行该应用程序。F5
当您运行 .NET Aspire 应用程序时,还会启动一个仪表板,您可以使用它来监视应用程序的各个部分。仪表板应类似于以下屏幕截图:
访问左侧导航中的每个链接可查看有关 .NET Aspire 应用程序的不同信息:
项目:列出 .NET Aspire 应用程序中所有单个 .NET 项目的基本信息,例如应用程序状态、端点地址和加载的环境变量。
Containers:列出有关应用程序容器的基本信息,例如状态、图像标签和端口号。您应该会看到为输出缓存添加的 Redis 容器以及您提供的名称。
可执行文件:列出您的应用程序使用的正在运行的可执行文件。示例应用程序不包含任何可执行文件,因此它应该显示消息No runningexecutablesfound。
日志:
项目:显示应用程序中项目的输出日志。使用页面顶部的下拉菜单选择您想要显示日志的项目。
容器:显示应用程序中容器的日志。您应该会看到来自作为模板一部分配置的容器的 Redis 日志。如果您有多个容器,您可以使用页面顶部的下拉列表选择要显示日志的容器。
可执行文件:显示应用程序中可执行文件的日志。示例应用程序不包含任何可执行文件,因此这里没有任何内容可看。
结构化:以表格格式显示结构化日志。这些日志还支持基本过滤、自由格式搜索和日志级别过滤。您应该看到来自apiservice和 的日志webfrontend。您可以通过选择行右端的“查看”按钮来展开每个日志条目的详细信息。
Traces:显示应用程序的跟踪,它可以跟踪通过您的应用程序的请求路径。找到/weather的请求,然后选择页面右侧的“查看” 。当请求穿过应用程序的不同部分时,仪表板应分阶段显示请求。
Metrics:显示您的应用程序公开的各种仪器和仪表及其相应的尺寸。指标根据过滤器的可用维度有条件地公开过滤器。
至此就构建了第一个.NET Aspire应用程序,更多详细信息请访问.NET Aspire文档。
扩展链接:
如何使用 Blazor 框架在前端浏览器中导入/导出 Excel XLSX
如何在.NET电子表格应用程序中创建流程图
如何将实时数据显示在前端电子表格中
本文是由葡萄城技术开发团队发布,转载请注明出处:葡萄城官网
原文链接:https://www.cnblogs.com/powertoolsteam/p/17835864.html
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728